From: p15692025051 <846603105@qq.com> Date: Mon, 15 May 2023 08:19:00 +0000 (+0800) Subject: sdk项目编译整理 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=ec0373e8c2c3b0435adc3a896d66d327b8afb613;p=mirrors%2FASR1603_G5.git sdk项目编译整理 --- diff --git a/2.sdk/images/customer_fs.bin b/2.sdk/images/customer_fs.bin new file mode 100644 index 00000000..0c732537 Binary files /dev/null and b/2.sdk/images/customer_fs.bin differ diff --git a/3.code/1.watch/3.font/ext_font.bin b/2.sdk/images/ext_font.bin similarity index 100% rename from 3.code/1.watch/3.font/ext_font.bin rename to 2.sdk/images/ext_font.bin diff --git a/2.sdk/images/ext_fs.bin b/2.sdk/images/ext_fs.bin new file mode 100644 index 00000000..b794f4d5 Binary files /dev/null and b/2.sdk/images/ext_fs.bin differ diff --git a/2.sdk/new.bat b/2.sdk/new.bat new file mode 100644 index 00000000..e92c5578 --- /dev/null +++ b/2.sdk/new.bat @@ -0,0 +1,34 @@ +@echo off +del images /q +Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c project\%1%\ext -b 4096 -r 4096 -p 4096 -s 2097152 -i images\ext_fs.bin +if errorlevel 0 ( + echo "ext_fs.binÉú³É³É¹¦ !!!!!!!!!!!!!!! " +) +if errorlevel 1 ( + echo "ext_fs.binÉú³Éʧ°Ü !!!!!!!!!!!!!!! " + goto exit +) +Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c project\%1%\usr -b 4096 -r 4096 -p 4096 -s 184320 -i images\customer_fs.bin +if errorlevel 0 ( + echo "customer_fs.binÉú³É³É¹¦ !!!!!!!!!!!!!!! " +) +if errorlevel 1 ( + echo "customer_fs.binÉú³Éʧ°Ü Çë¼ì²éusrĿ¼ÊÇ·ñ´óÓÚ180K!!!!!!!!!!!!!!!" + goto exit +) + +copy project\%1%\font\ext_font.bin images\ext_font.bin + +Helios_SDK\tools\common\win32\7z\7z a project\%1%\sdk\system\platform\ASR_1606\boards\EG810MCN_GA_ALIPAY\images\firmware_base_release_pack.zip images\ +if errorlevel 0 ( + echo imagesѹËõ³É¹¦!!!!!!!!!!!!!! +) +if errorlevel 1 ( + echo imagesѹËõʧ°Ü!!!!!!!!!!!!!!!!!! + goto exit +) +xcopy project\K5\sdk\ Helios_SDK\ /e/h/y +cd Helios_SDK +helios make services/microPython @EG810MCN_GA_ALIPAY EG810MCN_GA_ALIPAY +cd .. +:exit \ No newline at end of file diff --git a/3.code/1.watch/2.code/static/0_weather.png b/2.sdk/project/K5/ext/static/0_weather.png similarity index 100% rename from 3.code/1.watch/2.code/static/0_weather.png rename to 2.sdk/project/K5/ext/static/0_weather.png diff --git a/3.code/1.watch/2.code/static/1_weather.png b/2.sdk/project/K5/ext/static/1_weather.png similarity index 100% rename from 3.code/1.watch/2.code/static/1_weather.png rename to 2.sdk/project/K5/ext/static/1_weather.png diff --git a/3.code/1.watch/2.code/static/2_weather.png b/2.sdk/project/K5/ext/static/2_weather.png similarity index 100% rename from 3.code/1.watch/2.code/static/2_weather.png rename to 2.sdk/project/K5/ext/static/2_weather.png diff --git a/3.code/1.watch/2.code/static/3_weather.png b/2.sdk/project/K5/ext/static/3_weather.png similarity index 100% rename from 3.code/1.watch/2.code/static/3_weather.png rename to 2.sdk/project/K5/ext/static/3_weather.png diff --git a/3.code/1.watch/2.code/static/APP/alipay/1.jpg b/2.sdk/project/K5/ext/static/APP/alipay/1.jpg similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1.jpg rename to 2.sdk/project/K5/ext/static/APP/alipay/1.jpg diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_11.png b/2.sdk/project/K5/ext/static/APP/alipay/1_11.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1_11.png rename to 2.sdk/project/K5/ext/static/APP/alipay/1_11.png diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_11_1.png b/2.sdk/project/K5/ext/static/APP/alipay/1_11_1.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1_11_1.png rename to 2.sdk/project/K5/ext/static/APP/alipay/1_11_1.png diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_12.png b/2.sdk/project/K5/ext/static/APP/alipay/1_12.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1_12.png rename to 2.sdk/project/K5/ext/static/APP/alipay/1_12.png diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_12_1_1.png b/2.sdk/project/K5/ext/static/APP/alipay/1_12_1_1.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1_12_1_1.png rename to 2.sdk/project/K5/ext/static/APP/alipay/1_12_1_1.png diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_13.png b/2.sdk/project/K5/ext/static/APP/alipay/1_13.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1_13.png rename to 2.sdk/project/K5/ext/static/APP/alipay/1_13.png diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_13_1_1.png b/2.sdk/project/K5/ext/static/APP/alipay/1_13_1_1.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1_13_1_1.png rename to 2.sdk/project/K5/ext/static/APP/alipay/1_13_1_1.png diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_1_1.png b/2.sdk/project/K5/ext/static/APP/alipay/1_1_1.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1_1_1.png rename to 2.sdk/project/K5/ext/static/APP/alipay/1_1_1.png diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_2.jpg b/2.sdk/project/K5/ext/static/APP/alipay/1_2.jpg similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1_2.jpg rename to 2.sdk/project/K5/ext/static/APP/alipay/1_2.jpg diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_2_1.png b/2.sdk/project/K5/ext/static/APP/alipay/1_2_1.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1_2_1.png rename to 2.sdk/project/K5/ext/static/APP/alipay/1_2_1.png diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_2_2.png b/2.sdk/project/K5/ext/static/APP/alipay/1_2_2.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/1_2_2.png rename to 2.sdk/project/K5/ext/static/APP/alipay/1_2_2.png diff --git a/3.code/1.watch/2.code/static/APP/alipay/loading.jpg b/2.sdk/project/K5/ext/static/APP/alipay/loading.jpg similarity index 100% rename from 3.code/1.watch/2.code/static/APP/alipay/loading.jpg rename to 2.sdk/project/K5/ext/static/APP/alipay/loading.jpg diff --git a/3.code/1.watch/2.code/static/APP/wechat/R_1.png b/2.sdk/project/K5/ext/static/APP/wechat/R_1.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/wechat/R_1.png rename to 2.sdk/project/K5/ext/static/APP/wechat/R_1.png diff --git a/3.code/1.watch/2.code/static/APP/wechat/R_2.png b/2.sdk/project/K5/ext/static/APP/wechat/R_2.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/wechat/R_2.png rename to 2.sdk/project/K5/ext/static/APP/wechat/R_2.png diff --git a/3.code/1.watch/2.code/static/APP/wechat/R_3.png b/2.sdk/project/K5/ext/static/APP/wechat/R_3.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/wechat/R_3.png rename to 2.sdk/project/K5/ext/static/APP/wechat/R_3.png diff --git a/3.code/1.watch/2.code/static/APP/wechat/S_1.png b/2.sdk/project/K5/ext/static/APP/wechat/S_1.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/wechat/S_1.png rename to 2.sdk/project/K5/ext/static/APP/wechat/S_1.png diff --git a/3.code/1.watch/2.code/static/APP/wechat/S_2.png b/2.sdk/project/K5/ext/static/APP/wechat/S_2.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/wechat/S_2.png rename to 2.sdk/project/K5/ext/static/APP/wechat/S_2.png diff --git a/3.code/1.watch/2.code/static/APP/wechat/S_3.png b/2.sdk/project/K5/ext/static/APP/wechat/S_3.png similarity index 100% rename from 3.code/1.watch/2.code/static/APP/wechat/S_3.png rename to 2.sdk/project/K5/ext/static/APP/wechat/S_3.png diff --git a/3.code/1.watch/2.code/static/IMAGE_APP_QR_CODE.png b/2.sdk/project/K5/ext/static/IMAGE_APP_QR_CODE.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_APP_QR_CODE.png rename to 2.sdk/project/K5/ext/static/IMAGE_APP_QR_CODE.png diff --git a/3.code/1.watch/2.code/static/IMAGE_BUTTON_DELKEY.png b/2.sdk/project/K5/ext/static/IMAGE_BUTTON_DELKEY.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_BUTTON_DELKEY.png rename to 2.sdk/project/K5/ext/static/IMAGE_BUTTON_DELKEY.png diff --git a/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL.png b/2.sdk/project/K5/ext/static/IMAGE_BUTTON_DIAL.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL.png rename to 2.sdk/project/K5/ext/static/IMAGE_BUTTON_DIAL.png diff --git a/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL_CONTACT.png b/2.sdk/project/K5/ext/static/IMAGE_BUTTON_DIAL_CONTACT.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL_CONTACT.png rename to 2.sdk/project/K5/ext/static/IMAGE_BUTTON_DIAL_CONTACT.png diff --git a/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_TEST_DONE.jpg b/2.sdk/project/K5/ext/static/IMAGE_HEART_ONLY_TEST_DONE.jpg similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_TEST_DONE.jpg rename to 2.sdk/project/K5/ext/static/IMAGE_HEART_ONLY_TEST_DONE.jpg diff --git a/3.code/1.watch/2.code/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.png b/2.sdk/project/K5/ext/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.png rename to 2.sdk/project/K5/ext/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NOTICE_CALL.png b/2.sdk/project/K5/ext/static/IMAGE_NOTICE_CALL.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NOTICE_CALL.png rename to 2.sdk/project/K5/ext/static/IMAGE_NOTICE_CALL.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NOTICE_NONE.png b/2.sdk/project/K5/ext/static/IMAGE_NOTICE_NONE.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NOTICE_NONE.png rename to 2.sdk/project/K5/ext/static/IMAGE_NOTICE_NONE.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY0_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY0_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY0_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY0_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY1_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY1_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY1_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY1_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY2_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY2_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY2_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY2_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY3_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY3_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY3_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY3_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY4_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY4_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY4_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY4_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY5_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY5_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY5_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY5_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY6_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY6_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY6_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY6_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY7_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY7_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY7_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY7_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY8_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY8_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY8_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY8_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY9_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY9_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY9_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEY9_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYHASH_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEYHASH_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYHASH_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEYHASH_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYSTAR_ICON.png b/2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEYSTAR_ICON.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYSTAR_ICON.png rename to 2.sdk/project/K5/ext/static/IMAGE_NUMBER_KEYSTAR_ICON.png diff --git a/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg b/2.sdk/project/K5/ext/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg rename to 2.sdk/project/K5/ext/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg diff --git a/3.code/1.watch/2.code/static/IMAGE_STEP.png b/2.sdk/project/K5/ext/static/IMAGE_STEP.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMAGE_STEP.png rename to 2.sdk/project/K5/ext/static/IMAGE_STEP.png diff --git a/3.code/1.watch/2.code/static/IMG_CC_HUNGUP1.png b/2.sdk/project/K5/ext/static/IMG_CC_HUNGUP1.png similarity index 100% rename from 3.code/1.watch/2.code/static/IMG_CC_HUNGUP1.png rename to 2.sdk/project/K5/ext/static/IMG_CC_HUNGUP1.png diff --git a/3.code/1.watch/2.code/static/add_btn.png b/2.sdk/project/K5/ext/static/add_btn.png similarity index 100% rename from 3.code/1.watch/2.code/static/add_btn.png rename to 2.sdk/project/K5/ext/static/add_btn.png diff --git a/3.code/1.watch/2.code/static/answer.png b/2.sdk/project/K5/ext/static/answer.png similarity index 100% rename from 3.code/1.watch/2.code/static/answer.png rename to 2.sdk/project/K5/ext/static/answer.png diff --git a/2.sdk/project/K5/ext/static/audio_audio_haixiu.mp3 b/2.sdk/project/K5/ext/static/audio_audio_haixiu.mp3 new file mode 100644 index 00000000..5ef7a933 Binary files /dev/null and b/2.sdk/project/K5/ext/static/audio_audio_haixiu.mp3 differ diff --git a/3.code/1.watch/2.code/static/cancel_icon.png b/2.sdk/project/K5/ext/static/cancel_icon.png similarity index 100% rename from 3.code/1.watch/2.code/static/cancel_icon.png rename to 2.sdk/project/K5/ext/static/cancel_icon.png diff --git a/3.code/1.watch/2.code/static/charge_in.png b/2.sdk/project/K5/ext/static/charge_in.png similarity index 100% rename from 3.code/1.watch/2.code/static/charge_in.png rename to 2.sdk/project/K5/ext/static/charge_in.png diff --git a/3.code/1.watch/2.code/static/degree.png b/2.sdk/project/K5/ext/static/degree.png similarity index 100% rename from 3.code/1.watch/2.code/static/degree.png rename to 2.sdk/project/K5/ext/static/degree.png diff --git a/3.code/1.watch/2.code/static/find_phone.png b/2.sdk/project/K5/ext/static/find_phone.png similarity index 100% rename from 3.code/1.watch/2.code/static/find_phone.png rename to 2.sdk/project/K5/ext/static/find_phone.png diff --git a/3.code/1.watch/2.code/static/hang_up.png b/2.sdk/project/K5/ext/static/hang_up.png similarity index 100% rename from 3.code/1.watch/2.code/static/hang_up.png rename to 2.sdk/project/K5/ext/static/hang_up.png diff --git a/3.code/1.watch/2.code/static/low_power.png b/2.sdk/project/K5/ext/static/low_power.png similarity index 100% rename from 3.code/1.watch/2.code/static/low_power.png rename to 2.sdk/project/K5/ext/static/low_power.png diff --git a/3.code/1.watch/2.code/static/menu_connect_device.png b/2.sdk/project/K5/ext/static/menu_connect_device.png similarity index 100% rename from 3.code/1.watch/2.code/static/menu_connect_device.png rename to 2.sdk/project/K5/ext/static/menu_connect_device.png diff --git a/3.code/1.watch/2.code/static/menu_time.png b/2.sdk/project/K5/ext/static/menu_time.png similarity index 100% rename from 3.code/1.watch/2.code/static/menu_time.png rename to 2.sdk/project/K5/ext/static/menu_time.png diff --git a/3.code/1.watch/2.code/static/mpsignal1.png b/2.sdk/project/K5/ext/static/mpsignal1.png similarity index 100% rename from 3.code/1.watch/2.code/static/mpsignal1.png rename to 2.sdk/project/K5/ext/static/mpsignal1.png diff --git a/3.code/1.watch/2.code/static/mpsignal2.png b/2.sdk/project/K5/ext/static/mpsignal2.png similarity index 100% rename from 3.code/1.watch/2.code/static/mpsignal2.png rename to 2.sdk/project/K5/ext/static/mpsignal2.png diff --git a/3.code/1.watch/2.code/static/mpsignal3.png b/2.sdk/project/K5/ext/static/mpsignal3.png similarity index 100% rename from 3.code/1.watch/2.code/static/mpsignal3.png rename to 2.sdk/project/K5/ext/static/mpsignal3.png diff --git a/3.code/1.watch/2.code/static/mpsignal4.png b/2.sdk/project/K5/ext/static/mpsignal4.png similarity index 100% rename from 3.code/1.watch/2.code/static/mpsignal4.png rename to 2.sdk/project/K5/ext/static/mpsignal4.png diff --git a/3.code/1.watch/2.code/static/mpsignal5.png b/2.sdk/project/K5/ext/static/mpsignal5.png similarity index 100% rename from 3.code/1.watch/2.code/static/mpsignal5.png rename to 2.sdk/project/K5/ext/static/mpsignal5.png diff --git a/3.code/1.watch/2.code/static/off_icon.png b/2.sdk/project/K5/ext/static/off_icon.png similarity index 100% rename from 3.code/1.watch/2.code/static/off_icon.png rename to 2.sdk/project/K5/ext/static/off_icon.png diff --git a/3.code/1.watch/2.code/static/poweroff_icon.png b/2.sdk/project/K5/ext/static/poweroff_icon.png similarity index 100% rename from 3.code/1.watch/2.code/static/poweroff_icon.png rename to 2.sdk/project/K5/ext/static/poweroff_icon.png diff --git a/3.code/1.watch/2.code/static/reduce_btn.png b/2.sdk/project/K5/ext/static/reduce_btn.png similarity index 100% rename from 3.code/1.watch/2.code/static/reduce_btn.png rename to 2.sdk/project/K5/ext/static/reduce_btn.png diff --git a/3.code/1.watch/2.code/static/setting/menu_app_qrcode.png b/2.sdk/project/K5/ext/static/setting/menu_app_qrcode.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_app_qrcode.png rename to 2.sdk/project/K5/ext/static/setting/menu_app_qrcode.png diff --git a/3.code/1.watch/2.code/static/setting/menu_bright.png b/2.sdk/project/K5/ext/static/setting/menu_bright.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_bright.png rename to 2.sdk/project/K5/ext/static/setting/menu_bright.png diff --git a/3.code/1.watch/2.code/static/setting/menu_imei_qrcode.png b/2.sdk/project/K5/ext/static/setting/menu_imei_qrcode.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_imei_qrcode.png rename to 2.sdk/project/K5/ext/static/setting/menu_imei_qrcode.png diff --git a/3.code/1.watch/2.code/static/setting/menu_language.png b/2.sdk/project/K5/ext/static/setting/menu_language.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_language.png rename to 2.sdk/project/K5/ext/static/setting/menu_language.png diff --git a/3.code/1.watch/2.code/static/setting/menu_poweroff.png b/2.sdk/project/K5/ext/static/setting/menu_poweroff.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_poweroff.png rename to 2.sdk/project/K5/ext/static/setting/menu_poweroff.png diff --git a/3.code/1.watch/2.code/static/setting/menu_restore.png b/2.sdk/project/K5/ext/static/setting/menu_restore.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_restore.png rename to 2.sdk/project/K5/ext/static/setting/menu_restore.png diff --git a/3.code/1.watch/2.code/static/setting/menu_theme_switch.png b/2.sdk/project/K5/ext/static/setting/menu_theme_switch.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_theme_switch.png rename to 2.sdk/project/K5/ext/static/setting/menu_theme_switch.png diff --git a/3.code/1.watch/2.code/static/setting/menu_upgrade.png b/2.sdk/project/K5/ext/static/setting/menu_upgrade.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_upgrade.png rename to 2.sdk/project/K5/ext/static/setting/menu_upgrade.png diff --git a/3.code/1.watch/2.code/static/setting/menu_version.png b/2.sdk/project/K5/ext/static/setting/menu_version.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_version.png rename to 2.sdk/project/K5/ext/static/setting/menu_version.png diff --git a/3.code/1.watch/2.code/static/setting/menu_volume.png b/2.sdk/project/K5/ext/static/setting/menu_volume.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_volume.png rename to 2.sdk/project/K5/ext/static/setting/menu_volume.png diff --git a/3.code/1.watch/2.code/static/setting/menu_watch_switch.png b/2.sdk/project/K5/ext/static/setting/menu_watch_switch.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/menu_watch_switch.png rename to 2.sdk/project/K5/ext/static/setting/menu_watch_switch.png diff --git a/3.code/1.watch/2.code/static/setting/setting_text.png b/2.sdk/project/K5/ext/static/setting/setting_text.png similarity index 100% rename from 3.code/1.watch/2.code/static/setting/setting_text.png rename to 2.sdk/project/K5/ext/static/setting/setting_text.png diff --git a/3.code/1.watch/2.code/static/stopwatch_play.png b/2.sdk/project/K5/ext/static/stopwatch_play.png similarity index 100% rename from 3.code/1.watch/2.code/static/stopwatch_play.png rename to 2.sdk/project/K5/ext/static/stopwatch_play.png diff --git a/3.code/1.watch/2.code/static/stopwatch_reset.png b/2.sdk/project/K5/ext/static/stopwatch_reset.png similarity index 100% rename from 3.code/1.watch/2.code/static/stopwatch_reset.png rename to 2.sdk/project/K5/ext/static/stopwatch_reset.png diff --git a/3.code/1.watch/2.code/static/stopwatch_stop.png b/2.sdk/project/K5/ext/static/stopwatch_stop.png similarity index 100% rename from 3.code/1.watch/2.code/static/stopwatch_stop.png rename to 2.sdk/project/K5/ext/static/stopwatch_stop.png diff --git a/3.code/1.watch/2.code/static/storage_file/wechat_num.txt b/2.sdk/project/K5/ext/static/storage_file/wechat_num.txt similarity index 100% rename from 3.code/1.watch/2.code/static/storage_file/wechat_num.txt rename to 2.sdk/project/K5/ext/static/storage_file/wechat_num.txt diff --git a/3.code/1.watch/2.code/static/temp_bg.png b/2.sdk/project/K5/ext/static/temp_bg.png similarity index 100% rename from 3.code/1.watch/2.code/static/temp_bg.png rename to 2.sdk/project/K5/ext/static/temp_bg.png diff --git a/3.code/1.watch/2.code/static/time_down.png b/2.sdk/project/K5/ext/static/time_down.png similarity index 100% rename from 3.code/1.watch/2.code/static/time_down.png rename to 2.sdk/project/K5/ext/static/time_down.png diff --git a/3.code/1.watch/2.code/static/time_finish.png b/2.sdk/project/K5/ext/static/time_finish.png similarity index 100% rename from 3.code/1.watch/2.code/static/time_finish.png rename to 2.sdk/project/K5/ext/static/time_finish.png diff --git a/3.code/1.watch/2.code/static/time_up.png b/2.sdk/project/K5/ext/static/time_up.png similarity index 100% rename from 3.code/1.watch/2.code/static/time_up.png rename to 2.sdk/project/K5/ext/static/time_up.png diff --git a/3.code/1.watch/2.code/static/time_up1.png b/2.sdk/project/K5/ext/static/time_up1.png similarity index 100% rename from 3.code/1.watch/2.code/static/time_up1.png rename to 2.sdk/project/K5/ext/static/time_up1.png diff --git a/3.code/1.watch/2.code/static/time_up2.png b/2.sdk/project/K5/ext/static/time_up2.png similarity index 100% rename from 3.code/1.watch/2.code/static/time_up2.png rename to 2.sdk/project/K5/ext/static/time_up2.png diff --git a/3.code/1.watch/2.code/static/tool/IMAGE_SECMENU_ALARM.png b/2.sdk/project/K5/ext/static/tool/IMAGE_SECMENU_ALARM.png similarity index 100% rename from 3.code/1.watch/2.code/static/tool/IMAGE_SECMENU_ALARM.png rename to 2.sdk/project/K5/ext/static/tool/IMAGE_SECMENU_ALARM.png diff --git a/3.code/1.watch/2.code/static/tool/IMAGE_SECMENU_COUNTDOWN.png b/2.sdk/project/K5/ext/static/tool/IMAGE_SECMENU_COUNTDOWN.png similarity index 100% rename from 3.code/1.watch/2.code/static/tool/IMAGE_SECMENU_COUNTDOWN.png rename to 2.sdk/project/K5/ext/static/tool/IMAGE_SECMENU_COUNTDOWN.png diff --git a/3.code/1.watch/2.code/static/tool/IMAGE_SECMENU_STEP.png b/2.sdk/project/K5/ext/static/tool/IMAGE_SECMENU_STEP.png similarity index 100% rename from 3.code/1.watch/2.code/static/tool/IMAGE_SECMENU_STEP.png rename to 2.sdk/project/K5/ext/static/tool/IMAGE_SECMENU_STEP.png diff --git a/3.code/1.watch/2.code/static/tool/IMAGE_SECMENU_STOPWATCH.png b/2.sdk/project/K5/ext/static/tool/IMAGE_SECMENU_STOPWATCH.png similarity index 100% rename from 3.code/1.watch/2.code/static/tool/IMAGE_SECMENU_STOPWATCH.png rename to 2.sdk/project/K5/ext/static/tool/IMAGE_SECMENU_STOPWATCH.png diff --git a/3.code/1.watch/2.code/static/tool/IMAGE_SECMENU_WEATHER.png b/2.sdk/project/K5/ext/static/tool/IMAGE_SECMENU_WEATHER.png similarity index 100% rename from 3.code/1.watch/2.code/static/tool/IMAGE_SECMENU_WEATHER.png rename to 2.sdk/project/K5/ext/static/tool/IMAGE_SECMENU_WEATHER.png diff --git a/3.code/1.watch/2.code/static/tool/sms_setting.png b/2.sdk/project/K5/ext/static/tool/sms_setting.png similarity index 100% rename from 3.code/1.watch/2.code/static/tool/sms_setting.png rename to 2.sdk/project/K5/ext/static/tool/sms_setting.png diff --git a/3.code/1.watch/2.code/static/tool/tool_text.png b/2.sdk/project/K5/ext/static/tool/tool_text.png similarity index 100% rename from 3.code/1.watch/2.code/static/tool/tool_text.png rename to 2.sdk/project/K5/ext/static/tool/tool_text.png diff --git a/3.code/1.watch/2.code/static/update.png b/2.sdk/project/K5/ext/static/update.png similarity index 100% rename from 3.code/1.watch/2.code/static/update.png rename to 2.sdk/project/K5/ext/static/update.png diff --git a/3.code/1.watch/2.code/static/vbat_0.png b/2.sdk/project/K5/ext/static/vbat_0.png similarity index 100% rename from 3.code/1.watch/2.code/static/vbat_0.png rename to 2.sdk/project/K5/ext/static/vbat_0.png diff --git a/3.code/1.watch/2.code/static/vbat_100.png b/2.sdk/project/K5/ext/static/vbat_100.png similarity index 100% rename from 3.code/1.watch/2.code/static/vbat_100.png rename to 2.sdk/project/K5/ext/static/vbat_100.png diff --git a/3.code/1.watch/2.code/static/vbat_20.png b/2.sdk/project/K5/ext/static/vbat_20.png similarity index 100% rename from 3.code/1.watch/2.code/static/vbat_20.png rename to 2.sdk/project/K5/ext/static/vbat_20.png diff --git a/3.code/1.watch/2.code/static/vbat_40.png b/2.sdk/project/K5/ext/static/vbat_40.png similarity index 100% rename from 3.code/1.watch/2.code/static/vbat_40.png rename to 2.sdk/project/K5/ext/static/vbat_40.png diff --git a/3.code/1.watch/2.code/static/vbat_60.png b/2.sdk/project/K5/ext/static/vbat_60.png similarity index 100% rename from 3.code/1.watch/2.code/static/vbat_60.png rename to 2.sdk/project/K5/ext/static/vbat_60.png diff --git a/3.code/1.watch/2.code/static/vbat_80.png b/2.sdk/project/K5/ext/static/vbat_80.png similarity index 100% rename from 3.code/1.watch/2.code/static/vbat_80.png rename to 2.sdk/project/K5/ext/static/vbat_80.png diff --git a/3.code/1.watch/3.font/font_24.bin b/2.sdk/project/K5/font/ext_font.bin similarity index 98% rename from 3.code/1.watch/3.font/font_24.bin rename to 2.sdk/project/K5/font/ext_font.bin index e1ee16a2..da6ccf14 100644 Binary files a/3.code/1.watch/3.font/font_24.bin and b/2.sdk/project/K5/font/ext_font.bin differ diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/Makefile b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/Makefile similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/Makefile rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/Makefile diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/alarm.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/alarm.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/alarm.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/alarm.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/appAlipay.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appAlipay.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/appAlipay.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appAlipay.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/appFactoryMode.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/appFactoryMode.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/appWechat.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appWechat.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/appWechat.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appWechat.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/btn_device_ec800m.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/btn_device_ec800m.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/code.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/code.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/code.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/code.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/constants.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/constants.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/constants.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/constants.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/initTP.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/initTP.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/initTP.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/initTP.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/lcd.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/lcd.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/lcd.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/lcd.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/location.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/location.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/location.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/location.py diff --git a/3.code/1.watch/2.code/main.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/main.py similarity index 99% rename from 3.code/1.watch/2.code/main.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/main.py index 87095de4..195b84e9 100644 --- a/3.code/1.watch/2.code/main.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/main.py @@ -211,6 +211,6 @@ if __name__ == '__main__': app.append_manager(sm) app.start() print("init12:{}".format(utime.localtime())) - + #EventMesh.publish("load_screen", {"screen": "FIND"}) diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/main_1.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/main_1.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/main_1.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/main_1.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/mgr.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/mgr.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/protocol.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/protocol.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/protocol.py diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/sleep_test.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/sleep_test.py new file mode 100644 index 00000000..4c47c041 --- /dev/null +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/sleep_test.py @@ -0,0 +1,37 @@ +import uos +import ql_fs +if ql_fs.path_exists("/ext") == False: + 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 lcd import tp_cst816 +from btn_device_ec800m import BtnDevice + +import lvgl as lv +import utime +import osTimer +import pm +import ql_fs +from machine import Pin +from lcd import lcd,lcd_ctrl,tp_cst816,lcd_ctrl +from misc import PWM +import uos +from Hsensor import GH3018 +btn_device = BtnDevice(tp_cst816) +btn_device.start() +hsensor = GH3018() +hsensor.activate() +hsensor.init() +hsensor.open_blood_oxygen() +utime.sleep(5) +PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 0, 1) +PWM_backlight.open() +hsensor.close() +tp_cst816.suspend() +lcd.lcd_display_off() +#lcd_ctrl.write(0) +lv.autoSleep(1) +pm.autosleep(1) +print("test end2") \ No newline at end of file diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ui.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ui.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ui_WatchFaceScreen.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_WatchFaceScreen.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ui_WatchFaceScreen.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_WatchFaceScreen.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ui_main_menu.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_main_menu.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ui_main_menu.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_main_menu.py diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ui_setting.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_setting.py similarity index 100% rename from 2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ui_setting.py rename to 2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_setting.py diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/EG810MCN_GA_ALIPAY.mk b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/EG810MCN_GA_ALIPAY.mk similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/EG810MCN_GA_ALIPAY.mk rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/EG810MCN_GA_ALIPAY.mk diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/autoconf.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/autoconf.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/autoconf.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/autoconf.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/config.in b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/config.in similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/config.in rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/config.in diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/config.mk b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/config.mk similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/config.mk rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/config.mk diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lcd.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/gh301x.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lcd.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/gh301x.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lcd.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lcd.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/canvas.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/canvas.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/fs/extflash/helios.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/canvas.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/fs/extflash/helios.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/canvas.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/fs/helios.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/fs/extflash/helios.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/fs/helios.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/fs/extflash/helios.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/handler/task/priority.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/fs/helios.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/handler/task/priority.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/fs/helios.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/imgbtn.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/handler/task/priority.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/imgbtn.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/handler/task/priority.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/jpg/decode.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/imgbtn.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/jpg/decode.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/imgbtn.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/png/decode.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/jpg/decode.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/png/decode.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/jpg/decode.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/keyboard.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/keyboard.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/keyboard.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/keyboard.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/line.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/line.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/line.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/line.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/list.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/list.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/list.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/list.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/msgbox.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/msgbox.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/msgbox.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/msgbox.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/qrcode.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/png/decode.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/qrcode.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/png/decode.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/span.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/qrcode.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/span.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/qrcode.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/tileview.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/span.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/tileview.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/span.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/win.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/tileview.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/win.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/tileview.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/mbedtls.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/win.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/mbedtls.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/lvgl/win.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/vioce/call.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/mbedtls.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/vioce/call.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/mbedtls.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base.json b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/sc7a20.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base.json rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/sc7a20.h diff --git a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/vioce/call.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/include/config/vioce/call.h new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/mpconfigboard.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/mpconfigboard.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/mpconfigboard.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/mpconfigboard.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z diff --git a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base.json b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base.json new file mode 100644 index 00000000..e69de29b diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip similarity index 90% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip index 3b9e90d2..ac7d12b5 100644 Binary files a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip differ diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/include/app_link_start_addr.h b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/include/app_link_start_addr.h similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/include/app_link_start_addr.h rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/include/app_link_start_addr.h diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib diff --git a/2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib similarity index 100% rename from 2.sdk/Helios_SDK/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib rename to 2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib diff --git a/3.code/1.watch/2.code/main_1.py b/2.sdk/project/K5/usr/main.py similarity index 96% rename from 3.code/1.watch/2.code/main_1.py rename to 2.sdk/project/K5/usr/main.py index ad3dccb7..195b84e9 100644 --- a/3.code/1.watch/2.code/main_1.py +++ b/2.sdk/project/K5/usr/main.py @@ -76,7 +76,7 @@ if __name__ == '__main__': ui.add_screen(_ui.Spo2Screen()) ui.add_screen(_ui.TemperatureScreen()) ui.add_screen(_ui.ContactsScreen()) - from ext.appWechat import WechatScreen,TK_ProtoCol,MESSAGE_ProtoCol,NewWechatPopupScreen + from appWechat import WechatScreen,TK_ProtoCol,MESSAGE_ProtoCol,NewWechatPopupScreen ui.add_screen(WechatScreen()) from alarm import ClkListScreen,ClockManager,NewEditClk,CLKTimeScreen,ClkPeriod,PopupAlarmScreen ui.add_screen(ClkListScreen()) @@ -131,13 +131,13 @@ if __name__ == '__main__': from protocol import LK_ProtoCol,PING_ProtoCol,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,HRSTART_ProtoCol,CENTER_ProtoCol,UPLOAD_ProtoCol,\ - TEMP_ProtoCol,DLT_ProtoCol,WT_ProtoCol,UD_ProtoCol,REMIND_ProtoCol, CR_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,sosHome_dial_ProtoCol,\ + TEMP_ProtoCol,DLT_ProtoCol,WT_ProtoCol,UD_ProtoCol,REMIND_ProtoCol, CR_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,\ ProtoColResolver,PHL_ProtoCol,MONITOR_ProtoCol,bootoff_ProtoCol import mgr as mgr print("init7:{}".format(utime.localtime())) from mgr import ConfigStoreManager, LocationManager, SockManager,getVolumSizeManager,gethistoryDataManager,getUpLoadDataManager, \ - NetManager,AddrBookManager,MsgdetailManager,PhoneCallingManager,getStorageDataManager,getBrightnessManager,getHrTimeManager,getSosFlagManager + NetManager,AddrBookManager,MsgdetailManager,PhoneCallingManager,getStorageDataManager,getBrightnessManager,getHrTimeManager print("init8:{}".format(utime.localtime())) @@ -180,7 +180,6 @@ if __name__ == '__main__': app.append_manager(getStorageDataManager()) app.append_manager(getUpLoadDataManager()) app.append_manager(getVolumSizeManager()) - app.append_manager(getSosFlagManager()) print("init11:{}".format(utime.localtime())) pcr = ProtoColResolver() @@ -207,13 +206,11 @@ if __name__ == '__main__': # pcr.add_support(CENTER_ProtoCol()) pcr.add_support(CENTER_ProtoCol()) pcr.add_support(bootoff_ProtoCol()) - pcr.add_support(sosHome_dial_ProtoCol()) - sm = SockManager() sm.add_support_resolver(pcr) app.append_manager(sm) app.start() print("init12:{}".format(utime.localtime())) - + #EventMesh.publish("load_screen", {"screen": "FIND"}) diff --git a/3.code/1.watch/2.code/static/watch_plate/style_2/0_main2_weather.png b/2.sdk/project/K5/usr/static/0_main2_weather.png similarity index 100% rename from 3.code/1.watch/2.code/static/watch_plate/style_2/0_main2_weather.png rename to 2.sdk/project/K5/usr/static/0_main2_weather.png diff --git a/3.code/1.watch/2.code/static/watch_plate/style_2/1_main2_weather.png b/2.sdk/project/K5/usr/static/1_main2_weather.png similarity index 100% rename from 3.code/1.watch/2.code/static/watch_plate/style_2/1_main2_weather.png rename to 2.sdk/project/K5/usr/static/1_main2_weather.png diff --git a/3.code/1.watch/2.code/static/watch_plate/style_2/2_main2_weather.png b/2.sdk/project/K5/usr/static/2_main2_weather.png similarity index 100% rename from 3.code/1.watch/2.code/static/watch_plate/style_2/2_main2_weather.png rename to 2.sdk/project/K5/usr/static/2_main2_weather.png diff --git a/3.code/1.watch/2.code/static/watch_plate/style_2/3_main2_weather.png b/2.sdk/project/K5/usr/static/3_main2_weather.png similarity index 100% rename from 3.code/1.watch/2.code/static/watch_plate/style_2/3_main2_weather.png rename to 2.sdk/project/K5/usr/static/3_main2_weather.png diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.png b/2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_CALL.png similarity index 100% rename from 3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.png rename to 2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_CALL.png diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.png b/2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_CONTACTS.png similarity index 100% rename from 3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.png rename to 2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_CONTACTS.png diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.png b/2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.png similarity index 100% rename from 3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.png rename to 2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.png diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.png b/2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_SETTINGS.png similarity index 100% rename from 3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.png rename to 2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_SETTINGS.png diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.png b/2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_SPO2_DETECT.png similarity index 100% rename from 3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.png rename to 2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_SPO2_DETECT.png diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.png b/2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_TEMPERATURE.png similarity index 100% rename from 3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.png rename to 2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_TEMPERATURE.png diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.png b/2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_TOOLS.png similarity index 100% rename from 3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.png rename to 2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_TOOLS.png diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.png b/2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_WECHAT.png similarity index 100% rename from 3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.png rename to 2.sdk/project/K5/usr/static/IMAGE_ONE_PAGE_WECHAT.png diff --git a/3.code/1.watch/2.code/static/R_CALL_mp3.mp3 b/2.sdk/project/K5/usr/static/R_CALL_mp3.mp3 similarity index 100% rename from 3.code/1.watch/2.code/static/R_CALL_mp3.mp3 rename to 2.sdk/project/K5/usr/static/R_CALL_mp3.mp3 diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/alipay_.png b/2.sdk/project/K5/usr/static/alipay_.png similarity index 100% rename from 3.code/1.watch/2.code/static/main_menu/main_menu2/alipay_.png rename to 2.sdk/project/K5/usr/static/alipay_.png diff --git a/3.code/1.watch/2.code/static/watch_plate/style_2/degree.png b/2.sdk/project/K5/usr/static/degree.png similarity index 100% rename from 3.code/1.watch/2.code/static/watch_plate/style_2/degree.png rename to 2.sdk/project/K5/usr/static/degree.png diff --git a/3.code/1.watch/2.code/static/watch_plate/style_2/step.png b/2.sdk/project/K5/usr/static/step.png similarity index 100% rename from 3.code/1.watch/2.code/static/watch_plate/style_2/step.png rename to 2.sdk/project/K5/usr/static/step.png diff --git a/3.code/1.watch/1.doc/ALIPAY_API.xlsx b/3.code/1.watch/1.doc/ALIPAY_API.xlsx deleted file mode 100644 index 606aa8e9..00000000 Binary files a/3.code/1.watch/1.doc/ALIPAY_API.xlsx and /dev/null 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" deleted file mode 100644 index 4c76c932..00000000 Binary files "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" and /dev/null 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" deleted file mode 100644 index ce2bd79a..00000000 Binary files "a/3.code/1.watch/1.doc/Quectel_ALIPAY_API\350\257\264\346\230\216_2023_01_31.pdf" and /dev/null 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" deleted file mode 100644 index ef25a0ca..00000000 Binary files "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" and /dev/null 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" deleted file mode 100644 index 29c6bffd..00000000 Binary files "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" and /dev/null 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" deleted file mode 100644 index 85877771..00000000 Binary files "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" and /dev/null differ diff --git a/3.code/1.watch/2.code/EventMesh.py b/3.code/1.watch/2.code/EventMesh.py deleted file mode 100644 index 1b32fbdd..00000000 --- a/3.code/1.watch/2.code/EventMesh.py +++ /dev/null @@ -1,74 +0,0 @@ -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/alarm.py b/3.code/1.watch/2.code/alarm.py deleted file mode 100644 index 3cc4089e..00000000 --- a/3.code/1.watch/2.code/alarm.py +++ /dev/null @@ -1,982 +0,0 @@ -import modem -import osTimer -import utime -import lvgl as lv -import EventMesh -from machine import Timer -from ui import Screen -from common import Abstract, LogAdapter -from machine import RTC -import ujson -import ql_fs -import audio -from ui import style_img,style_screen,style_font_youyuan_20 -import ntptime -ntptime.settime(timezone=8) -""" -可以添加/编辑闹钟时间、周期; -最多添加三个闹钟; -可以删除已有的闹钟; -可以启用/禁用已有的闹钟; -保存已添加/编辑的闹钟信息,并在下次运行时恢复。 -""" -#标题高度 -TITLE_HEIGHT = 30 -#闹钟元素高度 -ALARM_HEIGHT = 75 -ALARM_WIDTH = 224 -#闹钟最大数量 -MAX_ALARM = 3 -#CONT的样式 -style_cont_alarm = lv.style_t() -style_cont_alarm.init() -style_cont_alarm.set_bg_color(lv.color_make(0x22, 0x28, 0x3D)) -style_cont_alarm.set_radius(0) -style_cont_alarm.set_pad_left(0) -style_cont_alarm.set_pad_right(0) -style_cont_alarm.set_pad_top(0) -style_cont_alarm.set_pad_bottom(0) - -#字体样式 -# style_font_white = lv.style_t() -# style_font_white.init() -# style_font_white.set_text_color(lv.color_make(0xff, 0xff, 0xff)) -# style_font_white.set_text_font_v2("font_24.bin",24,0) -# style_font_white.set_border_width(0) -# style_font_white.set_pad_left(0) -# style_font_white.set_pad_right(0) -# style_font_white.set_pad_top(0) -# style_font_white.set_pad_bottom(0) - -style_font_yellow = lv.style_t() -style_font_yellow.init() -style_font_yellow.set_text_color(lv.color_make(0xF1, 0xA3, 0x3B)) -style_font_yellow.set_text_font_v2("font_24.bin",24,0) - -#背景样式 -style_alarm_screen_default = lv.style_t() -style_alarm_screen_default.init() -style_alarm_screen_default.set_bg_color(lv.color_make(0x00, 0x00, 0x00)) -style_alarm_screen_default.set_border_width(0) -style_alarm_screen_default.set_pad_left(0) -style_alarm_screen_default.set_pad_right(0) -style_alarm_screen_default.set_pad_top(0) -style_alarm_screen_default.set_pad_bottom(0) - -# -------------------------------------------clk_list screen---------------------------------------------------------- -clk_list_screen = lv.obj() -clk_list_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_list_title_bg= lv.btn(clk_list_screen) -clk_list_title_bg.set_size(220,40) -clk_list_title_bg.set_pos(10,10) -clk_list_title_bg.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_list_title_bg.set_ext_click_area(40) - -clk_list_title = lv.label(clk_list_title_bg) -clk_list_title.set_pos(0, 15) -clk_list_title.set_size(240, 40) -clk_list_title.set_text("闹钟列表") -clk_list_title.set_long_mode(lv.label.LONG.WRAP) -clk_list_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -clk_list_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -# clk_list_add_btn = lv.btn(clk_list_screen) -# clk_list_add_btn.set_pos(180,45) -# clk_list_add_btn.set_size(50,20) -# clk_list_add_btn.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -# clk_list_add = lv.label(clk_list_screen) -# clk_list_add.set_pos(180, 45) -# clk_list_add.set_size(50, 20) -# clk_list_add.set_text("添加") -# clk_list_add.set_long_mode(lv.label.LONG.WRAP) -# clk_list_add.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -# clk_list_add.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -# clk_list_add.set_ext_click_area(15) - -clk_list_screen1_1 = lv.obj(clk_list_screen) -clk_list_screen1_1.set_pos(0, 65) -clk_list_screen1_1.set_size(240, 255) -clk_list_screen1_1.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT) - - - -no_add_alarm_img = lv.img(clk_list_screen1_1) -no_add_alarm_img.set_pos(63, 0) -no_add_alarm_img.set_size(113, 152) -no_add_alarm_img.set_src("E:/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.png") -no_add_alarm_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - -#暂未添加闹钟 -no_add_alarm = lv.label(clk_list_screen1_1) -no_add_alarm.set_pos(0, 170) -no_add_alarm.set_size(240, 50) -no_add_alarm.set_text("闹钟暂未设置") -no_add_alarm.set_long_mode(lv.label.LONG.WRAP) -no_add_alarm.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -no_add_alarm.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -# -------------------------------------------clk_edit screen---------------------------------------------------------- - -clk_edit_screen = lv.obj() -clk_edit_screen.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_edit_title = lv.label(clk_edit_screen) -clk_edit_title.set_pos(0, 0) -clk_edit_title.set_size(240, TITLE_HEIGHT) -clk_edit_title.set_text("编辑闹钟") -clk_edit_title.set_long_mode(lv.label.LONG.WRAP) -clk_edit_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -clk_edit_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_edit_time = lv.btn(clk_edit_screen) -clk_edit_time.set_size(224,75) -clk_edit_time.set_pos(8,58) -clk_edit_time.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_edit_time_label = lv.label(clk_edit_time) -clk_edit_time_label.set_pos(60, 15) -clk_edit_time_label.set_size(100, 40) -clk_edit_time_label.set_text("编辑时间") -clk_edit_time_label.set_long_mode(lv.label.LONG.WRAP) -clk_edit_time_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -clk_edit_time_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_edit_weekday = lv.btn(clk_edit_screen) -clk_edit_weekday.set_size(224,75) -clk_edit_weekday.set_pos(8,137) -clk_edit_weekday.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_edit_weekday_label = lv.label(clk_edit_weekday) -clk_edit_weekday_label.set_pos(60, 15) -clk_edit_weekday_label.set_size(100, 40) -clk_edit_weekday_label.set_text("编辑星期") -clk_edit_weekday_label.set_long_mode(lv.label.LONG.WRAP) -clk_edit_weekday_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -clk_edit_weekday_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_delete_alarm = lv.btn(clk_edit_screen) -clk_delete_alarm.set_size(224,75) -clk_delete_alarm.set_pos(8,216) -clk_delete_alarm.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_delete_alarm_label = lv.label(clk_delete_alarm) -clk_delete_alarm_label.set_pos(60, 15) -clk_delete_alarm_label.set_size(100, 40) -clk_delete_alarm_label.set_text("删除闹钟") -clk_delete_alarm_label.set_long_mode(lv.label.LONG.WRAP) -clk_delete_alarm_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -clk_delete_alarm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -# -------------------------------------------clk_repeat screen---------------------------------------------------------- -clk_repeat_screen = lv.obj() -clk_repeat_screen.set_scrollbar_mode(0) -clk_repeat_screen.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_repeat_btn = lv.btn(clk_repeat_screen) -clk_repeat_btn.set_size(224,40) -clk_repeat_btn.set_pos(9,40) -clk_repeat_btn.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_repeat_label = lv.label(clk_repeat_btn) -clk_repeat_label.set_pos(8, 10) -clk_repeat_label.set_size(103, 40) -clk_repeat_label.set_text("星期一") -clk_repeat_label.set_long_mode(lv.label.LONG.DOT) -clk_repeat_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_repeat_label.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - -clk_repeat_switch = lv.switch(clk_repeat_btn) -clk_repeat_switch.set_pos(191, 5) -clk_repeat_switch.set_size(24, 24) -clk_repeat_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN) -clk_repeat_switch.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR) -clk_repeat_switch.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB) -clk_repeat_switch.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED) -clk_repeat_switch.set_ext_click_area(20) -clk_repeat_switch.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED) - -clk_repeat_btn1 = lv.btn(clk_repeat_screen) -clk_repeat_btn1.set_size(224,40) -clk_repeat_btn1.set_pos(9,90) -clk_repeat_btn1.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_repeat_label1 = lv.label(clk_repeat_btn1) -clk_repeat_label1.set_pos(8, 10) -clk_repeat_label1.set_size(103, 40) -clk_repeat_label1.set_text("星期二") -clk_repeat_label1.set_long_mode(lv.label.LONG.DOT) -clk_repeat_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_repeat_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - -clk_repeat_switch1 = lv.switch(clk_repeat_btn1) -clk_repeat_switch1.set_pos(191, 5) -clk_repeat_switch1.set_size(24, 24) -clk_repeat_switch1.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN) -clk_repeat_switch1.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR) -clk_repeat_switch1.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB) -clk_repeat_switch1.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED) -clk_repeat_switch1.set_ext_click_area(20) -clk_repeat_switch1.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED) - - -clk_repeat_btn2 = lv.btn(clk_repeat_screen) -clk_repeat_btn2.set_size(224,40) -clk_repeat_btn2.set_pos(9,140) -clk_repeat_btn2.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_repeat_label2 = lv.label(clk_repeat_btn2) -clk_repeat_label2.set_pos(8, 10) -clk_repeat_label2.set_size(103, 40) -clk_repeat_label2.set_text("星期三") -clk_repeat_label2.set_long_mode(lv.label.LONG.DOT) -clk_repeat_label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_repeat_label2.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - -clk_repeat_switch2 = lv.switch(clk_repeat_btn2) -clk_repeat_switch2.set_pos(191, 5) -clk_repeat_switch2.set_size(24, 24) -clk_repeat_switch2.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN) -clk_repeat_switch2.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR) -clk_repeat_switch2.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB) -clk_repeat_switch2.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED) -clk_repeat_switch2.set_ext_click_area(20) -clk_repeat_switch2.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED) - -clk_repeat_btn3 = lv.btn(clk_repeat_screen) -clk_repeat_btn3.set_size(224,40) -clk_repeat_btn3.set_pos(9,190) -clk_repeat_btn3.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_repeat_label3 = lv.label(clk_repeat_btn3) -clk_repeat_label3.set_pos(8, 10) -clk_repeat_label3.set_size(103, 40) -clk_repeat_label3.set_text("星期四") -clk_repeat_label3.set_long_mode(lv.label.LONG.DOT) -clk_repeat_label3.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_repeat_label3.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - -clk_repeat_switch3 = lv.switch(clk_repeat_btn3) -clk_repeat_switch3.set_pos(191, 5) -clk_repeat_switch3.set_size(24, 24) -clk_repeat_switch3.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN) -clk_repeat_switch3.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR) -clk_repeat_switch3.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB) -clk_repeat_switch3.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED) -clk_repeat_switch3.set_ext_click_area(20) -clk_repeat_switch3.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED) - -clk_repeat_btn4 = lv.btn(clk_repeat_screen) -clk_repeat_btn4.set_size(224,40) -clk_repeat_btn4.set_pos(9,240) -clk_repeat_btn4.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_repeat_label4 = lv.label(clk_repeat_btn4) -clk_repeat_label4.set_pos(8, 10) -clk_repeat_label4.set_size(103, 40) -clk_repeat_label4.set_text("星期五") -clk_repeat_label4.set_long_mode(lv.label.LONG.DOT) -clk_repeat_label4.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_repeat_label4.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - -clk_repeat_switch4 = lv.switch(clk_repeat_btn4) -clk_repeat_switch4.set_pos(191, 5) -clk_repeat_switch4.set_size(24, 24) -clk_repeat_switch4.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN) -clk_repeat_switch4.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR) -clk_repeat_switch4.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB) -clk_repeat_switch4.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED) -clk_repeat_switch4.set_ext_click_area(20) -clk_repeat_switch4.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED) - -clk_repeat_btn5 = lv.btn(clk_repeat_screen) -clk_repeat_btn5.set_size(224,40) -clk_repeat_btn5.set_pos(9,290) -clk_repeat_btn5.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_repeat_label5 = lv.label(clk_repeat_btn5) -clk_repeat_label5.set_pos(8, 10) -clk_repeat_label5.set_size(103, 40) -clk_repeat_label5.set_text("星期六") -clk_repeat_label5.set_long_mode(lv.label.LONG.DOT) -clk_repeat_label5.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_repeat_label5.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - -clk_repeat_switch5 = lv.switch(clk_repeat_btn5) -clk_repeat_switch5.set_pos(191, 5) -clk_repeat_switch5.set_size(24, 24) -clk_repeat_switch5.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN) -clk_repeat_switch5.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR) -clk_repeat_switch5.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED) -clk_repeat_switch5.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB) -clk_repeat_switch5.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED) -clk_repeat_switch5.set_ext_click_area(20) - -clk_repeat_btn6 = lv.btn(clk_repeat_screen) -clk_repeat_btn6.set_size(224,40) -clk_repeat_btn6.set_pos(9,340) -clk_repeat_btn6.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) - -clk_repeat_label6 = lv.label(clk_repeat_btn6) -clk_repeat_label6.set_pos(8, 10) -clk_repeat_label6.set_size(103, 40) -clk_repeat_label6.set_text("星期日") -clk_repeat_label6.set_long_mode(lv.label.LONG.DOT) -clk_repeat_label6.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_repeat_label6.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - -clk_repeat_switch6 = lv.switch(clk_repeat_btn6) -clk_repeat_switch6.set_pos(191, 5) -clk_repeat_switch6.set_size(24, 24) -clk_repeat_switch6.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN) -clk_repeat_switch6.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR) -clk_repeat_switch6.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.KNOB) -clk_repeat_switch6.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED) -clk_repeat_switch6.set_ext_click_area(20) -clk_repeat_switch6.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.INDICATOR| lv.STATE.CHECKED) - -# -------------------------------------------clk_repeat screen---------------------------------------------------------- -clk_time_screen = lv.obj() -clk_time_screen.set_scrollbar_mode(0) -clk_time_screen.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -#hour的样式 -style_roller_hour_main = lv.style_t() -style_roller_hour_main.init() -style_roller_hour_main.set_radius(6) -style_roller_hour_main.set_bg_color(lv.color_make(0x00, 0x00, 0x00)) -style_roller_hour_main.set_bg_opa(102) -style_roller_hour_main.set_border_width(0) - -style_roller_hour_selected = lv.style_t() -style_roller_hour_selected.init() -style_roller_hour_selected.set_radius(6) -style_roller_hour_selected.set_bg_color(lv.color_make(0x2c, 0x2c, 0x2f)) -style_roller_hour_selected.set_border_width(0) - -#创建hour的roller -clk_time_roller_1 = lv.roller(clk_time_screen) -clk_time_roller_1.set_width(50) -clk_time_roller_1.set_pos(60, 50) -clk_time_roller_1.set_options( - "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23", - lv.roller.MODE.NORMAL) -clk_time_roller_1.set_visible_row_count(5) -clk_time_roller_1.add_style(style_roller_hour_main, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_time_roller_1.add_style(style_roller_hour_selected, lv.PART.SELECTED | lv.STATE.DEFAULT) - -#min的样式 -#创建min的roller -clk_time_roller_2 = lv.roller(clk_time_screen) -clk_time_roller_2.set_width(50) -clk_time_roller_2.set_pos(130, 50) -clk_time_roller_2.set_options( - "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59", - lv.roller.MODE.NORMAL) -clk_time_roller_2.set_visible_row_count(5) -clk_time_roller_2.add_style(style_roller_hour_main, lv.PART.MAIN | lv.STATE.DEFAULT) -clk_time_roller_2.add_style(style_roller_hour_selected, lv.PART.SELECTED | lv.STATE.DEFAULT) - -#完成按钮 -alarm_ok= lv.btn(clk_time_screen) -alarm_ok.set_size(150,40) -alarm_ok.set_pos(45,250) -alarm_ok.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) -alarm_ok.set_ext_click_area(20) - -label_ok = lv.label(alarm_ok) -label_ok.set_pos(30, 20) -label_ok.set_size(100, 40) -label_ok.set_text("完成") -label_ok.set_long_mode(lv.label.LONG.DOT) -label_ok.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -label_ok.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - -#闹钟信息 -alarm_list = [] - -class ClockManager(Abstract): - def __init__(self): - super().__init__() - self.rtc = RTC() - self.days = 0 - self.idx = 0 - - def post_processor_after_instantiation(self): - EventMesh.subscribe("push_clock_info", self.set) - EventMesh.subscribe("read_alarminjson", self.read_alarminjson) - EventMesh.subscribe("add_alarm", self.add_alarm) - EventMesh.subscribe("remove_alarm", self.remove_alarm) - EventMesh.subscribe("set_rtc_alarm", self.set_rtc_alarm) - - def set(self, event, msg): - global alarm_list - print("msg = {}".format(msg)) - idx = msg.get("idx") - print("修改第{}个闹钟信息{}".format(idx,alarm_list[idx])) - alarm_list[idx]["hour"] = msg["hour"] - alarm_list[idx]["minute"] = msg["minute"] - alarm_list[idx]["days"] = msg["days"] - alarm_list[idx]["enabled"] = msg["enabled"] - alarm_list[idx]["repeart"] = msg["repeart"] - with open("/ext/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd: - ujson.dump(alarm_list,fd) - - def read_alarminjson(self, event, msg): - IFEXIST = ql_fs.path_exists("/ext/static/storage_file/alarm_msg.json") - global alarm_list - if IFEXIST == False: - with open("/ext/static/storage_file/alarm_msg.json","w",encoding='utf-8') as fd: - ujson.dump(alarm_list,fd) - print("闹钟信息加载完成") - else: - with open("/ext/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd: - alarm_list = ujson.load(fd) - - def add_alarm(self, event, msg): - global alarm_list - idx = len(alarm_list) - print("add_here-----idx:",idx) - alarm_list.append({"idx": idx, "hour": 0, "minute": 0, "days": [], "enabled": False,"repeart":1}) - with open("/ext/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd: - ujson.dump(alarm_list,fd) - - def remove_alarm(self, event, msg): - global alarm_list - print("ddddddddddddddddddd:",msg) - idx = msg.get("idx") - print("delete_here1-----{},{}:".format(idx,msg)) - - for i, alarm in enumerate(alarm_list): - print("delete_here2-----{},{}:".format(i,alarm)) - - if alarm["idx"] == idx: - del alarm_list[i] - print("delete_here3-----",alarm_list) - - #删除闹钟后,对idx重新排序 - if alarm_list: - for j in range(i,len(alarm_list)): - alarm_list[j]["idx"] -= 1 - print("delete_here4-----",alarm_list) - - with open("/ext/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd: - ujson.dump(alarm_list,fd) - - def _rtc_callback(self,args): - print("---!!!!!!alarm_ring!!!!!!!---,idx:",args) - global alarm_list - EventMesh.publish("read_alarminjson") - idx = self.idx - print("单次闹钟关闭:",idx) - #判断是否是单次闹钟,如果是,则将开关状态设置为关闭 - print("关闭1:",alarm_list [idx]["days"]) - if not alarm_list [idx]["days"] : - print("关闭2:",alarm_list [idx]["days"]) - alarm_list[idx]["enabled"] = False - with open("/ext/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd: - ujson.dump(alarm_list,fd) - - #设置下一个闹钟 - EventMesh.publish("set_rtc_alarm") - get_hr_state = EventMesh.publish("get_hr_state") - get_spo2_state = EventMesh.publish("get_spo2_state") - if get_hr_state != None or get_spo2_state != None: - if get_hr_state != 1 and get_spo2_state != 1: - EventMesh.publish("load_screen", {"screen": "popup_alarm"}) - - # def _reset_rtc_alarm_time(self, args): - # print("---alarm_ring---") - - def set_rtc_alarm(self,event,msg): - global alarm_list - EventMesh.publish("read_alarminjson") - rtc_now_time = self.rtc.datetime() - - print("00获取所有闹钟信息:{}".format(alarm_list)) - new_alarm_list = [(alarm['hour'], alarm['minute'], alarm['days'],alarm["idx"]) for alarm in alarm_list if alarm['enabled']] - - print("01获取开启的闹钟:{}".format(new_alarm_list)) - start_day = 0 # 周日 - start_minute = 0 # 0点 - end_minute = 60*24*7 - minute_list = [] - - if not new_alarm_list: - print("02当前并没有开启的闹钟,退出闹钟设置程序:{}".format(new_alarm_list)) - self.rtc.enable_alarm(0) - return - - for alarm in new_alarm_list: - hour, minute, days,idx = alarm - #如果没有选择day,则表示是单次闹钟 - if days: - for day in days: - minute_list.append(hour*60 + minute + (day-start_day)*24*60) - - else: - #如果当前时间没超过闹钟设置时间,则设置为今天,否则设置为明天 - if (hour*60 + minute) > (rtc_now_time[4]*60 + rtc_now_time[5]): - minute_list.append(hour*60 + minute + (rtc_now_time[3]-start_day)*24*60) - print("设置单次闹钟:{}".format(new_alarm_list)) - - else: - minute_list.append(hour*60 + minute + (rtc_now_time[3]-start_day+1)*24*60) - - total_minutes = sorted(minute_list) - print("02以周日00:00为起点,计算所有开启闹钟的total_min并排序:{}".format(total_minutes)) - - #获取当前时间 (2020, 9, 11, 5, 15, 43, 23, 0) - # rtc_now_time = (2020, 9, 11, 6, 11, 43, 23, 0) - # rtc_now_time = self.rtc.datetime() - - print("03当前的rtc时间:{}".format(rtc_now_time)) - - current_minute = rtc_now_time[4]*60 + rtc_now_time[5] + (rtc_now_time[3]-start_day)*24*60 - print("04当前的rtc_total_minutes:{}".format(current_minute)) - - if current_minute in minute_list: - print("当前时间和闹钟列表时间重复,删除重复的时间") - minute_list.remove(current_minute) - - minute_list.append(current_minute) - - # 对分钟数列表进行排序,并获取当前时间分钟数所在的位置 - minute_list = sorted(minute_list) - current_index = minute_list.index(current_minute) - - print("05将当前时间插入min_list后的min_list:{}".format(minute_list)) - print("06当前时间所在位置:{}".format(current_index)) - - next_index = current_index + 1 - if next_index >= len(minute_list): - next_minute = minute_list[0] - print("07下一个闹钟的分钟数:", next_minute) - else: - next_minute = minute_list[next_index] - print("07下一个闹钟的分钟数:", next_minute) - - if next_minute >= current_minute: - interval_minute = next_minute - current_minute - print("08距离下一次响铃的的分钟数:", interval_minute) - else: - interval_minute = end_minute - current_minute + next_minute - print("08距离下一次响铃的的分钟数:", interval_minute) - - #反向获取时间戳 - time = utime.localtime() - print("09获取utime的时间戳:", time) - rtc_mktime = utime.mktime(time) - print("10反向获取utime的mktime:", rtc_mktime) - - #加上下一次响铃需要的时间 - next_alarm_mktime = rtc_mktime + interval_minute*60 - print("11下一次响铃的mktime:", next_alarm_mktime) - - #格式化时间戳,得到下一次闹钟的时间 - next_alarm_time = utime.localtime(next_alarm_mktime) - print("12下一次响铃的准确时间:", next_alarm_time) - #将时间转换为rtc的格式 - data_l = [2021, 7, 9, 5, 12, 30, 0, 0] - #给rtc时间赋值 - data_l[0] = next_alarm_time[0] #year - data_l[1] = next_alarm_time[1] #month - data_l[2] = next_alarm_time[2] #day - data_l[4] = next_alarm_time[3] #hour - data_l[5] = next_alarm_time[4] #minute - #转换为元组 - data_e=tuple(data_l) - print("13将该时间转换为RTC元组:", data_e) - - for alarm in alarm_list: - if not alarm["days"] and alarm["enabled"]: - print("关闭666:",alarm["idx"]) - if alarm["hour"] == data_l[4] and alarm["minute"]==data_l[5]: - self.idx = alarm["idx"] - #设置rtc闹钟时间 - self.rtc.register_callback(self._rtc_callback) - - FLAG = self.rtc.set_alarm(data_e) - if FLAG == 0: - print("14成功设置rtc的到期时间:", data_e) - else: - print("14设置rtc的到期时间失败:", data_e) - - self.rtc.enable_alarm(1) - -#闹钟弹窗 -popup_alarm_screen = lv.obj() -popup_alarm_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - -popup_alarm_img = lv.img(popup_alarm_screen) -popup_alarm_img.set_pos(63, 20) -popup_alarm_img.set_size(113, 152) -popup_alarm_img.set_src("E:/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.png") -popup_alarm_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - -popup_alarm_time = lv.label(popup_alarm_screen) -popup_alarm_time.set_pos(0, 200) -popup_alarm_time.set_size(240, 50) -popup_alarm_time.set_text(" ") -popup_alarm_time.set_long_mode(lv.label.LONG.WRAP) -popup_alarm_time.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -popup_alarm_time.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -#闹钟列表 -class PopupAlarmScreen(Screen): - NAME = "popup_alarm" - def __init__(self): - super().__init__() - self.meta = popup_alarm_screen - self.timer = osTimer() - self.aud = audio.Audio(0) - self.alarm_count = 0 - - def initialization(self): - self.alarm_count = 0 - self.timer.start(3*1000,1,self.exit_alarm_page) - time = EventMesh.publish("screen_get_time")#获取系统时间 - popup_alarm_time.set_text("{}:{}".format("%02d"%(time[0][0]),"%02d"%(time[0][1]))) - - - def Close(self): - self.alarm_count=0 - self.timer.stop() - self.aud.stop() - - def exit_alarm_page(self,*arges): - self.alarm_count+=1 - if self.alarm_count > 10: - self.alarm_count = 0 - self.aud.stop() - self.timer.stop() - EventMesh.publish("load_screen", {"screen": "main_menu"}) - return - self.aud.play(1, 1, 'E:/static/audio_audio_haixiu.mp3') #播放声音 - - - - def done_left_to_right(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_right_to_left(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_bottom_to_top(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_top_to_bottom(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -#闹钟列表 -class ClkListScreen(Screen): - NAME = "clk_list" - def __init__(self): - super().__init__() - self.meta = clk_list_screen - self.clock_list = [] - # clk_list_add_btn.add_event_cb(lambda e: self.add_alarm_btn(e), - # lv.EVENT.PRESSED, None) - self.weekdays_list = ["日","一","二","三","四","五","六"] - EventMesh.subscribe("push_update_alarm_show", self.update_show_info) - self.alarm_show_list = lv.obj(clk_list_screen) - self.timer=osTimer() - - - def initialization(self): - EventMesh.publish("read_alarminjson") - EventMesh.publish("set_rtc_alarm") - print("n闹钟列表初始化!!") - self.alarm_draw_btn() - - def update_show_info(self,event,msg): - EventMesh.publish("read_alarminjson") - self.timer.start(1*1000,0,self.delay_update) - def delay_update(self,*agrs): - EventMesh.publish("set_rtc_alarm") - self.alarm_draw_btn() - - - def alarm_draw_btn(self): - global alarm_list - self.clock_list = alarm_list - IFEXIST = ql_fs.path_exists("/ext/static/storage_file/alarm_msg.json") - if IFEXIST == True: - if self.clock_list: - # print("nalarm_list:{}".format(alarm_list)) - no_add_alarm_img.add_flag(lv.obj.FLAG.HIDDEN) - no_add_alarm.add_flag(lv.obj.FLAG.HIDDEN) - self.alarm_show_list.delete()#先删除一次控件 - self.alarm_show_list = lv.obj(clk_list_screen) - self.alarm_show_list.set_pos(0, 65) - self.alarm_show_list.set_size(240, 255) - self.alarm_show_list.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - self.alarm_show_list.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - #print("菜单的孩子个数:",clk_list_screen1.get_child_cnt()) - num = 0 - for i ,each in enumerate(self.clock_list): - - _btn = lv.btn(self.alarm_show_list) - _btn.set_size(230,75) - _btn.set_pos(8,79*i) - _btn.add_style(style_cont_alarm, lv.PART.MAIN | lv.STATE.DEFAULT) - _btn.add_event_cb(lambda e: self.edit_alarm(e), - lv.EVENT.CLICKED, None) - - num = each["idx"] - # print("------刷新闹钟列表噢:{} num:{}",each,num) - _btn_label1 = lv.label(_btn) - _btn_label1.set_pos(50, 0) - _btn_label1.set_size(0, 0) - _btn_label1.set_text(str(num)) - - _btn_label2 = lv.label(_btn) - _btn_label2.set_pos(8, 10) - _btn_label2.set_size(97, 40) - _btn_label2.set_text("%02d" % each["hour"] + ":"+"%02d" % each["minute"]) - # _btn_label2.set_text(str(each["days"])) - - _btn_label2.set_long_mode(lv.label.LONG.DOT) - _btn_label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - _btn_label2.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - _new_list = sorted(each["days"]) - repeart = each["repeart"] - _output = [self.weekdays_list[x] for x in _new_list] - _btn_label3 = lv.label(_btn) - _btn_label3.set_pos(5, 40) - _btn_label3.set_size(200, 40) - print("_new_list:{} repeart:{}".format(_new_list,repeart)) - if repeart == 1: - _btn_label3.set_text("一次") - elif repeart == 2: - _btn_label3.set_text("每天") - else: - _btn_label3.set_text(",".join(_output)) - _btn_label3.set_long_mode(lv.label.LONG.DOT) - _btn_label3.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - _btn_label3.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - # _btn_switch = lv.switch(_btn) - # _btn_switch.set_pos(178, 29) - # _btn_switch.set_size(50, 25) - # _btn_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.INDICATOR) - # _btn_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.INDICATOR| lv.STATE.CHECKED) - # _btn_switch.add_event_cb(lambda e: - # self.switch_event_cb(e), - # lv.EVENT.VALUE_CHANGED, - # None) - - # _btn_switch.set_style_bg_color(lv.color_make(0xf1, 0xa3, 0x3b),lv.PART.KNOB| lv.STATE.CHECKED) - # _btn_switch.set_style_bg_color(lv.color_make(0x3d, 0x3d, 0x3d),lv.PART.KNOB) - - # _btn_switch.set_ext_click_area(40) - # if each["enabled"]: - # _btn_switch.add_state(lv.STATE.CHECKED) - # else: - # _btn_switch.clear_state(lv.STATE.CHECKED) - else: - no_add_alarm_img.clear_flag(lv.obj.FLAG.HIDDEN) - no_add_alarm.clear_flag(lv.obj.FLAG.HIDDEN) - self.alarm_show_list.add_flag(lv.obj.FLAG.HIDDEN) - else: - no_add_alarm_img.clear_flag(lv.obj.FLAG.HIDDEN) - no_add_alarm.clear_flag(lv.obj.FLAG.HIDDEN) - self.alarm_show_list.add_flag(lv.obj.FLAG.HIDDEN) - - def edit_alarm(self, e):#暂时屏蔽 - return - idx = int(e.get_target().get_child(0).get_text()) - print("edit!!!!!!!!!!!!:",idx) - clock_info = self.clock_list[idx] - clock_info["idx"] = idx - - EventMesh.publish("load_screen", {"screen": "new_edit_clk","meta": clock_info}) - - def add_alarm_btn(self, e): - - if len(self.clock_list) >= 3: - return - print("!!!!!!!!!!!!!!!!!------") - EventMesh.publish("add_alarm") - self.alarm_draw_btn() - - # def switch_event_cb(self, e): - # obj = e.get_target() - # idx = int(e.get_target().get_parent().get_child(0).get_text()) - # clock_info = self.clock_list[idx] - # print("修改闹钟开关:",self.clock_list[idx]) - # clock_info["idx"] = idx - # if obj.has_state(lv.STATE.CHECKED): - # print("ON ~~~") - # clock_info["enabled"] = True - # else: - # print("OFF ~~~") - # clock_info["enabled"] = False - # EventMesh.publish("push_clock_info", clock_info) - # EventMesh.publish("set_rtc_alarm") - - # print("sw_event_cb ~~~") - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "toolbox"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "toolbox"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -class NewEditClk(Screen): - NAME = "new_edit_clk" - - def __init__(self): - super().__init__() - self.meta = clk_edit_screen - clk_edit_weekday.add_event_cb(lambda e: self.edit_weekday(e), lv.EVENT.CLICKED, None) - clk_edit_time.add_event_cb(lambda e: self.edit_time(e), lv.EVENT.CLICKED, None) - clk_delete_alarm.add_event_cb(lambda e: self.delete_alarm(e), lv.EVENT.CLICKED, None) - - def initialization(self): - print("hahahahh",self.meta_info["idx"]) - - def delete_alarm(self, e): - EventMesh.publish("remove_alarm",self.meta_info) - - EventMesh.publish("load_screen", {"screen": "clk_list"}) - - - def edit_weekday(self,e): - self.load_screen(e, {"screen": "clk_period", - "meta": self.meta_info}) - - def edit_time(self,e): - self.load_screen(e, {"screen": "clk_time", - "meta": self.meta_info}) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "clk_list"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "clk_list"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "clk_list"}) - -class CLKTimeScreen(Screen): - NAME = "clk_time" - - def __init__(self): - super().__init__() - self.meta = clk_time_screen - # alarm_ok.add_event_cb(lambda e: self.handler(e), lv.EVENT.PRESSED, None) - - def initialization(self): - roll_1_v = self.meta_info["hour"] - roll_2_v = self.meta_info["minute"] - - clk_time_roller_1.set_selected(int(roll_1_v), lv.ANIM.ON) - clk_time_roller_2.set_selected(int(roll_2_v), lv.ANIM.ON) - - def handler(self, e): - option_1 = " " * 10 - option_2 = " " * 10 - clk_time_roller_2.get_selected_str(option_2, len(option_2)) - clk_time_roller_1.get_selected_str(option_1, len(option_1)) - option_1_strip = option_1.strip()[:2] - option_2_strip = option_2.strip()[:2] - print("option_1_strip = {} option_2_strip = {}".format(option_1_strip, option_2_strip)) - self.meta_info["hour"] = int(option_1_strip) - self.meta_info["minute"] = int(option_2_strip) - EventMesh.publish("push_clock_info", self.meta_info) - - EventMesh.publish("load_screen", {"screen": "clk_list"}) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "clk_list"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "clk_list"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "clk_list"}) - -class ClkPeriod(Screen): - NAME = "clk_period" - - def __init__(self): - super().__init__() - self.meta = clk_repeat_screen - self.choice_list=[] - self.alarm_info={} - self.clk_switch_list = [ - clk_repeat_switch6, - clk_repeat_switch, - clk_repeat_switch1, - clk_repeat_switch2, - clk_repeat_switch3, - clk_repeat_switch4, - clk_repeat_switch5, - - ] - - clk_repeat_switch.add_event_cb(lambda e: self.save_choice(e,1), lv.EVENT.VALUE_CHANGED, None) - clk_repeat_switch1.add_event_cb(lambda e: self.save_choice(e,2), lv.EVENT.VALUE_CHANGED, None) - clk_repeat_switch2.add_event_cb(lambda e: self.save_choice(e,3), lv.EVENT.VALUE_CHANGED, None) - clk_repeat_switch3.add_event_cb(lambda e: self.save_choice(e,4), lv.EVENT.VALUE_CHANGED, None) - clk_repeat_switch4.add_event_cb(lambda e: self.save_choice(e,5), lv.EVENT.VALUE_CHANGED, None) - clk_repeat_switch5.add_event_cb(lambda e: self.save_choice(e,6), lv.EVENT.VALUE_CHANGED, None) - clk_repeat_switch6.add_event_cb(lambda e: self.save_choice(e,0), lv.EVENT.VALUE_CHANGED, None) - - def initialization(self): - self.choice_list = self.meta_info["days"] - self.alarm_info = self.meta_info - print("初始化:{},{}".format(self.alarm_info,self.choice_list)) - - - for i in range(0,6): - if i in self.choice_list: - self.clk_switch_list[i].add_state(lv.STATE.CHECKED) - - else: - self.clk_switch_list[i].clear_state(lv.STATE.CHECKED) - - - def save_choice(self,e,i): - if i in self.choice_list: - self.clk_switch_list[i].clear_state(lv.STATE.CHECKED) - self.choice_list.remove(i) - print("here1-----",self.choice_list,i) - - else: - self.clk_switch_list[i].add_state(lv.STATE.CHECKED) - self.choice_list.append(i) - print("here2-----",self.choice_list,i) - - print("here-----",self.choice_list) - self.alarm_info["days"] = self.choice_list - - print("编辑星期:{}".format(self.alarm_info)) - if self.alarm_info["days"] == []: - self.alarm_info["repeart"] = 1 - else: - num = self.alarm_info["days"] - if len(num) >= 7: - self.alarm_info["repeart"] = 2 - else: - self.alarm_info["repeart"] = 3 - - EventMesh.publish("push_clock_info", self.alarm_info) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "clk_list"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "clk_list"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "clk_list"}) - diff --git a/3.code/1.watch/2.code/appAlipay.py b/3.code/1.watch/2.code/appAlipay.py deleted file mode 100644 index d968b40e..00000000 --- a/3.code/1.watch/2.code/appAlipay.py +++ /dev/null @@ -1,877 +0,0 @@ -import modem -import sim -import osTimer -import ALIPAY -from common import Lock, Abstract, LogAdapter -import utime -import lvgl as lv -import EventMesh -from machine import Timer -import constants -from misc import Power -import pm -from 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_24.bin",24,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 = "voPuTFiLcdA" - self.pk_aliyun = "a1c7Ojs6HMR" - self.ps_aliyun = "TxPFIJ5F1kwa0zO3" - self.product_type = 0 - self.timer_Alipay = osTimer() - - - self.is_simcard_identify = 255 - self.is_init = 255 - self.upay_bound = 0 #绑定结果 - 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) - if 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: - 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) - self.timer_Alipay.start(20000, 1, self.timeout_Alipay) - def post_processor_after_instantiation(self): - print("post_processor_after_instantiation") - - - EventMesh.subscribe("alipay_unbind", self.alipay_unbind) - - 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) - EventMesh.subscribe("get_alipay_init", self.get_alipay_init) - EventMesh.subscribe("alipay_exit", self.alipay_exit) - - 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_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: - 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) - - if self.is_init == 0 : - self.alipay.enable_collectioncode(1) - print("self.is_pay_init:%d"%self.is_init) - - 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(1000); - 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(500) - 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(500) - - 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 alipay_unbind(self, event, msg): - self.alipay.unbind() - - 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 get_alipay_init(self, event, msg): - return self.is_init - - def alipay_exit(self, event, msg): - if self.is_init == 0 : - args = "" - userdata = "" - ret = self.alipay.msg_send(11,args,userdata) #发送退出程序命令 - print("alipay_exit") - - 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 : - 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!!!") - - -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)) - -alipay_open_screen = lv.obj() -alipay_open_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -# add style for watchface -alipay_open_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -#进入图片 -AlipayOpen_img = lv.img(alipay_open_screen) -AlipayOpen_img.set_pos(int(70),int(80)) -AlipayOpen_img.set_size(100,100) -AlipayOpen_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -AlipayOpen_img.add_flag(lv.obj.FLAG.CLICKABLE) -AlipayOpen_img.set_src("E:/static/APP/alipay/1.jpg") -AlipayOpen_img.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) -class AlipayOpenScreen(Screen): - NAME = "alipay_open" - #打开支付宝 - def __init__(self): - super().__init__() - self.meta = alipay_open_screen - self.timer_AlipayOpen = osTimer() - - def initialization(self): - print("AlipayOpenScreen:initialization") - self.timer_AlipayOpen.start(1000, 1, self.timeout_AlipayOpen) - pass - - def timeout_AlipayOpen(self, *args, **kwargs): - if EventMesh.publish("get_alipay_init") == 0: - EventMesh.publish("alipay_1") - self.timer_AlipayOpen.stop() - - def post_processor_after_initialization(self): - pass - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def Close(self): - self.timer_AlipayOpen.stop() - EventMesh.publish("alipay_exit") - - pass - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -alipay_1_1_screen = lv.obj() -alipay_1_1_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -# add style for watchface -alipay_1_1_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) -#付款码 -alipay_imgbtn_3 = lv.img(alipay_1_1_screen) -alipay_imgbtn_3.set_pos(8,10) -alipay_imgbtn_3.set_size(224,69) -alipay_imgbtn_3.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -alipay_imgbtn_3.add_flag(lv.obj.FLAG.CLICKABLE) -alipay_imgbtn_3.set_src("E:/static/APP/alipay/1_13.png") -alipay_imgbtn_3.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) -#收钱 -alipay_imgbtn_2 = lv.img(alipay_1_1_screen) -alipay_imgbtn_2.set_pos(8,86) -alipay_imgbtn_2.set_size(224,69) -alipay_imgbtn_2.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -alipay_imgbtn_2.add_flag(lv.obj.FLAG.CLICKABLE) -alipay_imgbtn_2.set_src("E:/static/APP/alipay/1_12.png") -alipay_imgbtn_2.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) -#家长设置 -alipay_imgbtn_1 = lv.img(alipay_1_1_screen) -alipay_imgbtn_1.set_pos(8,168) -alipay_imgbtn_1.set_size(224,69) -alipay_imgbtn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -alipay_imgbtn_1.add_flag(lv.obj.FLAG.CLICKABLE) -alipay_imgbtn_1.set_src("E:/static/APP/alipay/1_11.png") -alipay_imgbtn_1.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -class Alipay_1_1(Screen): - NAME = "alipay_1_1" - #已绑定,显示功能列表 - def __init__(self): - super().__init__() - self.meta = alipay_1_1_screen - #付款码 - alipay_imgbtn_3.add_event_cb(lambda e: self.alipay_paycode(e), - lv.EVENT.PRESSED, None) - #收钱 - alipay_imgbtn_2.add_event_cb(lambda e: self.alipay_collect(e), - lv.EVENT.PRESSED, None) - #家长设置 - alipay_imgbtn_1.add_event_cb(lambda e: self.alipay_parent(e), - lv.EVENT.PRESSED, None) - - def initialization(self): - pass - - def Close(self): - EventMesh.publish("alipay_exit") - 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 done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -alipay_invite_screen = lv.obj() -alipay_invite_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -# add style for watchface -alipay_invite_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -#背景 -alipay_invite_bg = lv.img(alipay_invite_screen) -alipay_invite_bg.center() -alipay_invite_bg.set_size(240,240) -alipay_invite_bg.set_src("E:/static/APP/alipay/1_2.jpg") -alipay_invite_bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -#提示词 -alipay_invite_label = lv.label(alipay_invite_bg) -alipay_invite_label.set_pos(0, 8) -alipay_invite_label.set_size(240, 50) -alipay_invite_label.set_long_mode(lv.label.LONG.WRAP) -alipay_invite_label.set_text("请家长用手机支付宝扫一扫") -alipay_invite_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -alipay_invite_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -#二维码 -alipay_invite_bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5) -alipay_invite_fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4) - -alipay_invite_alipay_qr = lv.qrcode(alipay_invite_bg, 150, alipay_invite_fg_color, alipay_invite_bg_color) -alipay_invite_alipay_qr.set_pos(41,67) -# Add a border with alipay_invite_bg_color -alipay_invite_alipay_qr.set_style_border_color(alipay_invite_bg_color, 0) -alipay_invite_alipay_qr.set_style_border_width(5, 0) -class Alipay_invite(Screen): - NAME = "alipay_invite" - #未绑定,获取二维码显示 - def __init__(self): - super().__init__() - self.meta = alipay_invite_screen - - 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)) - alipay_invite_alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data)) - - def Close(self): - EventMesh.publish("alipay_exit") - pass - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -alipay_inviting_screen = lv.obj() -alipay_inviting_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -# add style for watchface -alipay_inviting_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -#提示词 -alipay_inviting_label = lv.label(alipay_inviting_screen) -alipay_inviting_label.set_pos(0, 158) -alipay_inviting_label.set_size(240, 24) -alipay_inviting_label.set_long_mode(lv.label.LONG.WRAP) -alipay_inviting_label.set_text("绑定中,不要走开") -alipay_inviting_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -alipay_inviting_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -class Alipay_inviting(Screen): - NAME = "alipay_inviting" - - def __init__(self): - super().__init__() - self.meta = alipay_inviting_screen - - def initialization(self): - pass - - def post_processor_after_initialization(self): - pass - - def Close(self): - EventMesh.publish("alipay_exit") - pass - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -alipay_success_screen = lv.obj() -alipay_success_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -# add style for watchface -alipay_success_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -#背景 -alipay_success_bg = lv.img(alipay_success_screen) -alipay_success_bg.set_pos(56,30) -alipay_success_bg.set_size(128,127) -alipay_success_bg.set_src("E:/static/APP/alipay/1_2_1.png") -alipay_success_bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -#提示词 -alipay_success_label = lv.label(alipay_success_screen) -alipay_success_label.set_pos(0, 168) -alipay_success_label.set_size(240, 29) -alipay_success_label.set_long_mode(lv.label.LONG.WRAP) -alipay_success_label.set_text("绑定成功") -alipay_success_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -alipay_success_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -class Alipay_success(Screen): - NAME = "alipay_success" - - def __init__(self): - super().__init__() - self.meta = alipay_success_screen - self.timer_Alipay_success = osTimer() - - def initialization(self): - self.timer_Alipay_success.start(1000, 0, self.timeout_Alipay_success) - - def post_processor_after_initialization(self): - pass - - def timeout_AlipayOpen(self, *args, **kwargs): - EventMesh.publish("load_screen", {"screen": "alipay_1_1"}) - self.timer_AlipayOpen.stop() - - - def Close(self): - EventMesh.publish("alipay_exit") - pass - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -alipay_paycode_screen = lv.obj() -alipay_paycode_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -# add style for watchface -alipay_paycode_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -alipay_paycode = lv.tileview(alipay_paycode_screen) -alipay_paycode.center() -alipay_paycode.set_size(240, 320) -alipay_paycode.add_style(style_alipay_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -# 1 - 条形码界面 -alipay_barcode = alipay_paycode.add_tile(0, 0, lv.DIR.LEFT | lv.DIR.RIGHT) - -#椭圆背景 -alipay_paycode_cont = lv.obj(alipay_barcode) -alipay_paycode_cont.set_size(240,220) -alipay_paycode_cont.set_pos(0,21) -alipay_paycode_cont.add_style(style_cont_alipay, lv.PART.MAIN | lv.STATE.DEFAULT) - - -#提示词 -alipay_paycode_label = lv.label(alipay_barcode) -alipay_paycode_label.set_pos(0, 33) -alipay_paycode_label.set_size(240, 24) -alipay_paycode_label.set_long_mode(lv.label.LONG.WRAP) -alipay_paycode_label.set_text("收银员扫一扫,完成付款") -alipay_paycode_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -alipay_paycode_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - -#条形码 -alipay_paycode_bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5) -alipay_paycode_fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4) -alipay_bar = lv.qrcode(alipay_barcode, 150, alipay_paycode_fg_color, alipay_paycode_bg_color) -alipay_bar.set_pos(33,61) -alipay_bar.set_style_border_color(alipay_paycode_bg_color, 0) -alipay_bar.set_style_border_width(5, 0) - -#编号 - -# 2 - 二维码界面 -alipay_qrcode = alipay_paycode.add_tile(1, 0, lv.DIR.LEFT | lv.DIR.RIGHT) - -#白色背景 - -#提示词 -alipay_paycode_label1 = lv.label(alipay_qrcode) -alipay_paycode_label1.set_pos(0, 33) -alipay_paycode_label1.set_size(240, 24) -alipay_paycode_label1.set_long_mode(lv.label.LONG.WRAP) -alipay_paycode_label1.set_text("收银员扫一扫,完成付款") -alipay_paycode_label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -alipay_paycode_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -#二维码 - -alipay_paycode_alipay_qr = lv.qrcode(alipay_qrcode, 150, alipay_paycode_fg_color, alipay_paycode_bg_color) -alipay_paycode_alipay_qr.set_pos(33,61) -alipay_paycode_alipay_qr.set_style_border_color(alipay_paycode_bg_color, 0) -alipay_paycode_alipay_qr.set_style_border_width(5, 0) -class Alipay_paycode(Screen): - NAME = "alipay_paycode" - - def __init__(self): - super().__init__() - self.meta = alipay_paycode_screen - - def post_processor_after_initialization(self): - self.alipay_qr_data = str(self.meta_info) - print("alipay_paycode:",str(self.meta_info)) - alipay_paycode_alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data)) - alipay_bar.update(self.alipay_qr_data,len(self.alipay_qr_data)) - - def Close(self): - EventMesh.publish("alipay_exit") - pass - def done_return(self): - EventMesh.publish("load_screen", {"screen": "alipay_1_1"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -alipay_pay_success_screen = lv.obj() -alipay_pay_success_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -# add style for watchface -alipay_pay_success_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) - - #支付成功LOGO -alipay_pay_bg = lv.img(alipay_pay_success_screen) -alipay_pay_bg.set_pos(82, 120) -alipay_pay_bg.set_size(78,78) -alipay_pay_bg.set_src("E:/static/APP/alipay/1_13_1_1.png") -alipay_pay_bg.add_flag(lv.obj.FLAG.CLICKABLE) -alipay_pay_bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - - -#付款金额 -alipay_pay_label = lv.label(alipay_pay_success_screen) -alipay_pay_label.set_pos(0, 220) -alipay_pay_label.set_size(240, 45) -alipay_pay_label.set_long_mode(lv.label.LONG.WRAP) -alipay_pay_label.set_text(" ") -alipay_pay_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -alipay_pay_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - -#完成按钮 -alipay_pay_text = lv.label(alipay_pay_success_screen) -alipay_pay_text.set_text("支付完成") -alipay_pay_text.set_pos(8, 10) -alipay_pay_text.set_size(220,40) -alipay_pay_text.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) -alipay_pay_text.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -class Alipay_pay_success(Screen): - NAME = "alipay_pay_success" - - def __init__(self): - super().__init__() - self.meta = alipay_pay_success_screen - alipay_pay_bg.add_event_cb(lambda e: self.button_cb(e), lv.EVENT.CLICKED, None) - - def post_processor_after_initialization(self): - print("money:",str(self.meta_info)) - alipay_pay_label.set_text(str(self.meta_info)) - - def button_cb(self,e): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def initialization(self): - pass - - def Close(self): - EventMesh.publish("alipay_exit") - pass - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -alipay_collect_screen = lv.obj() -alipay_collect_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -# add style for watchface -alipay_collect_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -#二维码 -alipay_collect_bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5) -alipay_collect_bg_fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4) - -alipay_collect_alipay_qr = lv.qrcode(alipay_collect_screen, 150, alipay_collect_bg_fg_color, alipay_collect_bg_color) -alipay_collect_alipay_qr.set_pos(33,22) -# Add a border with bg_color -alipay_collect_alipay_qr.set_style_border_color(alipay_collect_bg_color, 0) -alipay_collect_alipay_qr.set_style_border_width(5, 0) - -#提示词 -alipay_collect_label = lv.label(alipay_collect_screen) -alipay_collect_label.set_pos(0, 204) -alipay_collect_label.set_size(240, 50) -alipay_collect_label.set_long_mode(lv.label.LONG.WRAP) -alipay_collect_label.set_text("请对方使用支付宝扫码") -alipay_collect_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -alipay_collect_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -class Alipay_collect(Screen): - NAME = "alipay_collect" - - def __init__(self): - super().__init__() - self.meta = alipay_collect_screen - - - - 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)) - alipay_collect_alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data)) - - def Close(self): - EventMesh.publish("alipay_exit") - pass - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "alipay_1_1"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -alipay_parent_screen = lv.obj() -alipay_parent_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -# add style for watchface -alipay_parent_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -#家长头像 -alipay_parent_bg = lv.img(alipay_parent_screen) -alipay_parent_bg.set_pos(8,12) -alipay_parent_bg.set_size(81,81) -alipay_parent_bg.set_src("E:/static/APP/alipay/1_11_1.png") -alipay_parent_bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -#提示词 -alipay_parent_label = lv.label(alipay_parent_screen) -alipay_parent_label.set_pos(104, 12) -alipay_parent_label.set_size(96, 29) -alipay_parent_label.set_long_mode(lv.label.LONG.WRAP) -alipay_parent_label.set_text("家长设置") -alipay_parent_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -alipay_parent_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -alipay_parent_label1 = lv.label(alipay_parent_screen) -alipay_parent_label1.set_pos(100, 43) -alipay_parent_label1.set_size(120, 29) -alipay_parent_label1.set_long_mode(lv.label.LONG.WRAP) -alipay_parent_label1.set_text("零花钱管理") -alipay_parent_label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -alipay_parent_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -alipay_parent_label2 = lv.label(alipay_parent_screen) -alipay_parent_label2.set_pos(100, 71) -alipay_parent_label2.set_size(120, 29) -alipay_parent_label2.set_long_mode(lv.label.LONG.WRAP) -alipay_parent_label2.set_text("解绑退钱") -alipay_parent_label2.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -alipay_parent_label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -#家长码 -alipay_parent_bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5) -alipay_parent_fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4) - -alipay_parent_alipay_qr = lv.qrcode(alipay_parent_screen, 150, alipay_parent_fg_color, alipay_parent_bg_color) -alipay_parent_alipay_qr.set_pos(8,171) -# Add a border with bg_color -alipay_parent_alipay_qr.set_style_border_color(alipay_parent_bg_color, 0) -alipay_parent_alipay_qr.set_style_border_width(5, 0) -class Alipay_parent(Screen): - NAME = "alipay_parent" - - def __init__(self): - super().__init__() - self.meta = alipay_parent_screen - - - - 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)) - alipay_parent_alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data)) - - def Close(self): - EventMesh.publish("alipay_exit") - pass - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "alipay_1_1"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) \ No newline at end of file diff --git a/3.code/1.watch/2.code/appFactoryMode.py b/3.code/1.watch/2.code/appFactoryMode.py deleted file mode 100644 index 078e0d77..00000000 --- a/3.code/1.watch/2.code/appFactoryMode.py +++ /dev/null @@ -1,159 +0,0 @@ -import osTimer -import lvgl as lv -import EventMesh -import osTimer -import constants -import ujson -import ql_fs -import audio -from machine import Pin -from ui import style_screen,style_font_youyuan_20,ContStyle,style_btn,style_img,Screen,style_contact_btn -import audio -factorymode_cont_y = 0 -factorymode_screen = lv.obj() -factorymode_screen.center() -factorymode_screen.set_size(240, 320) -factorymode_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -factorymode_title = lv.label(factorymode_screen) -factorymode_title.set_pos(0, 10) -factorymode_title.set_size(240, 40) -factorymode_title.set_text("-工厂模式-") -factorymode_title.set_long_mode(lv.label.LONG.WRAP) -factorymode_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -factorymode_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -factorymode_cont = lv.obj(factorymode_screen) -factorymode_cont.set_pos(0, 50) -factorymode_cont.set_size(240, 270) -factorymode_cont_style = ContStyle() -factorymode_cont.add_style( - factorymode_cont_style.style_cont(0, lv.color_make(0x00, 0x00, 0x00), lv.color_make(0x00, 0x00, 0x00), 255), - lv.PART.MAIN | lv.STATE.DEFAULT) - -factorymode_location = lv.btn(factorymode_cont) -factorymode_location.set_pos(0, factorymode_cont_y) -factorymode_location.set_size(240, 60) -factorymode_location_label = lv.label(factorymode_location) -factorymode_location_label.set_text("定位测试") -factorymode_location.set_style_pad_all(0, lv.STATE.DEFAULT) -factorymode_location_label.align(lv.ALIGN.LEFT_MID, 70, 0) -factorymode_location_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) -factorymode_location_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -factorymode_location.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) -factorymode_cont_y+=60 - -class FactoryModeScreen(Screen): - NAME = "factorymode" - def __init__(self): - super().__init__() - self.meta = factorymode_screen - factorymode_location.add_event_cb(lambda e: self.load_screen(e, {"screen": "FactoryModeLocation"}), lv.EVENT.CLICKED, None) - - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -FactoryModeLocation_screen = lv.obj() -FactoryModeLocation_screen.center() -FactoryModeLocation_screen.set_size(240, 320) -FactoryModeLocation_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -FactoryModeLocation_WIFI_label = lv.label(FactoryModeLocation_screen) -FactoryModeLocation_WIFI_label.set_text("WIFI:\n") -FactoryModeLocation_WIFI_label.set_size(240, 80) -FactoryModeLocation_WIFI_label.set_pos(0, 0) -FactoryModeLocation_WIFI_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) -FactoryModeLocation_WIFI_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -FactoryModeLocation_CALL_label = lv.label(FactoryModeLocation_screen) -FactoryModeLocation_CALL_label.set_text("CALL:\n") -FactoryModeLocation_CALL_label.set_size(240, 40) -FactoryModeLocation_CALL_label.set_pos(0, 80) -FactoryModeLocation_CALL_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) -FactoryModeLocation_CALL_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -FactoryModeLocation_GNSS_label = lv.label(FactoryModeLocation_screen) -FactoryModeLocation_GNSS_label.set_text("GNSS:\n") -FactoryModeLocation_GNSS_label.set_size(240, 200) -FactoryModeLocation_GNSS_label.set_pos(0, 120) -FactoryModeLocation_GNSS_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) -FactoryModeLocation_GNSS_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -class FactoryModeLocationScreen(Screen): - NAME = "FactoryModeLocation" - def __init__(self): - super().__init__() - self.meta = FactoryModeLocation_screen - - def post_processor_after_initialization(self): - EventMesh.subscribe("PUSH_LOCATION_DATA",self.GET_LOCATION_DATA) - EventMesh.publish(constants.EVENT.START_LOCATION, 1) #测试模式 - FactoryModeLocation_GNSS_label.set_text("GNSS:\n") - FactoryModeLocation_WIFI_label.set_text("WIFI:\n") - FactoryModeLocation_CALL_label.set_text("CALL:") - def GET_LOCATION_DATA(self, event, msg): - #print("GPS:{}".format(msg[0])) - print("WIFI:{}".format(msg[1])) - print("CALL:{}".format(msg[2])) - EventMesh.publish("system_sleep_rest")#防止黑屏 - if msg[1] != [] : #WIFI - WIFI_len = len(msg[1][1]) - WIFI_DATA = "WIFI:\n" - if WIFI_len > 3: - WIFI_len = 3 - for i in range(WIFI_len) : - WIFI_DATA += "{}\n".format(msg[1][1][i]) - FactoryModeLocation_WIFI_label.set_text(WIFI_DATA) - - if len(msg[0]) > 1 : #GPS - GNSS_DATA = "GNSS:\n" - - gsv_data = msg[0][1].split("GSV") - if len(gsv_data) < 2 : - return - gsv_data = gsv_data[1:] - - GSV_dict= {} - for i in range(len(gsv_data)) : - gsv_data[i] = gsv_data[i].split("\r\n")[0] - gsv_tmp = gsv_data[i].split(",") - if len(gsv_tmp) < 7 : - break - gsv_tmp = gsv_tmp[4:] - #print("gsv_tmp:{}".format(gsv_tmp)) - for i in range(len(gsv_tmp)) : - if i % 4 == 0: - GSV_dict[gsv_tmp[i]] = gsv_tmp[i+3] - #print("GSV_dict:{}:[{}]".format(gsv_tmp[i],gsv_tmp[i+3])) - if len(gsv_tmp)-i < 4: - break - count = 0 - for key in GSV_dict : - GNSS_DATA+=" {}:[{}]\n".format(key,GSV_dict[key]) - count+=1 - if count > 9: - break - print("GxGSV:{}".format(GNSS_DATA)) - FactoryModeLocation_GNSS_label.set_text(GNSS_DATA) - if msg[2] != [] :#基站 - if len(msg[2]) > 2 : - FactoryModeLocation_CALL_label.set_text("CALL:{}".format(msg[2][0])) - def Close(self): - EventMesh.publish(constants.EVENT.CLOSE_LOCATION) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "factorymode"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "factorymode"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) \ No newline at end of file diff --git a/3.code/1.watch/2.code/appWechat.py b/3.code/1.watch/2.code/appWechat.py deleted file mode 100644 index f37e40d0..00000000 --- a/3.code/1.watch/2.code/appWechat.py +++ /dev/null @@ -1,675 +0,0 @@ -import osTimer -import lvgl as lv -import EventMesh -import osTimer -import constants -import ujson -import ql_fs -import audio -from machine import Pin -from ui import style_font_youyuan_20,style_screen,Screen,style_font_youyuan_20_black,style_img -import audio -from machine import Pin -from protocol import ProtoCol,UnicodeHexStr_To_Utf8Str - -style_wechat_r_btn = lv.style_t() -style_wechat_r_btn.init() -style_wechat_r_btn.set_bg_color(lv.color_make(0x00, 0xff, 0x2a)) -style_wechat_r_btn.set_border_width(0) -style_wechat_r_btn.set_shadow_opa(0) - - -style_wechat_s_btn = lv.style_t() -style_wechat_s_btn.init() -style_wechat_s_btn.set_bg_color(lv.color_make(0xff, 0xff, 0xff)) -style_wechat_s_btn.set_border_width(0) -style_wechat_s_btn.set_shadow_opa(0) - -style_common_bg_rect_btn_pressed = lv.style_t() -style_common_bg_rect_btn_pressed.init() -style_common_bg_rect_btn_pressed.set_bg_color(lv.color_make(0x1E, 0x26, 0xff)) -style_common_bg_rect_btn_pressed.set_bg_opa(100) -style_common_bg_rect_btn_pressed.set_border_width(0) -style_common_bg_rect_btn_pressed.set_shadow_opa(0) - -style_wechat_btn = lv.style_t() -style_wechat_btn.init() -style_wechat_btn.set_bg_color(lv.color_make(0x1E, 0x26, 0xff)) -style_wechat_btn.set_border_width(0) -style_wechat_btn.set_shadow_opa(0) - -# -------------------------------------------wechat screen---------------------------------------------------------- -wechat_screen = lv.obj() -wechat_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -wechat_press_btn = lv.btn(wechat_screen) -wechat_press_btn.set_pos(10, 260) -wechat_press_btn.set_size(220, 56) -wechat_press_btn.add_style(style_wechat_btn, lv.PART.MAIN | lv.STATE.DEFAULT) -wechat_press_btn.add_style(style_common_bg_rect_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_screen) -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) - - -wechat_press_label_countdown = lv.label(wechat_screen) -wechat_press_label_countdown.set_pos(100, 100) -wechat_press_label_countdown.set_size(40, 40) -wechat_press_label_countdown.set_text(" ") -wechat_press_label_countdown.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -wechat_press_label_countdown.set_long_mode(lv.label.LONG.WRAP) -wechat_press_label_countdown.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0) - - - - - -class WechatScreen(Screen): - NAME = "wechat" - - def __init__(self): - super().__init__() - self.MXA_MSG = 10 - self.wechat_recode_list = {} - self.wechat_num = 0 - self.read_data = {} - self.volum_size = 8 - self.msg_tmp = "" - check_txt = ql_fs.path_exists("/ext/static/storage_file/wechat_num.txt") - if check_txt == True : - with open("/ext/static/storage_file/wechat_num.txt","r") as fd:#音频文件编号 - num_tmp = fd.read() - if not num_tmp: - self.wechat_num = 0 - else: - self.wechat_num = int(num_tmp)# - if self.wechat_num != 0: - with open("/ext/static/storage_file/wechat_record.json","r",encoding="utf-8") as fd:#音频文件记录 - self.wechat_recode_list = ujson.load(fd)#读取每一个amr音频文件的时长ui_setting.py - - self.record_test = audio.Record() - self.aud = audio.Audio(0) - self.aud.set_pa(Pin.GPIO29) - check_volum = ql_fs.path_exists("/ext/static/storage_file/config.json") - if check_volum == True : - with open("/ext/static/storage_file/config.json","r") as fd:#音频文件编号 - self.read_data = ujson.load(fd) - if self.read_data != {}: - b = str("volum") in self.read_data.keys() - if b == True: - self.volum_size = self.read_data["volum"] - else: - self.volum_size = 8 - else: - self.volum_size = 8 - else: - self.volum_size = 8 - self.aud.setVolume(self.volum_size) - self.meta = wechat_screen - wechat_press_btn.add_event_cb(lambda e: self.talking(e), - lv.EVENT.LONG_PRESSED, None) - wechat_press_btn.add_event_cb(lambda e: self.sending(e), - lv.EVENT.RELEASED, None) - self.timer = osTimer() - self.second_timer = osTimer() - self.play_timer = osTimer() - - - - self.startY = 0 - self.startWidth = 0 - self.check_json = 0 - self.wechat_list =lv.obj() - EventMesh.subscribe("wechat_updata_list_show", self.wechat_updata_list_show) - EventMesh.subscribe("get_wechat_data", self.get_wechat_data) - EventMesh.subscribe("set_wechat_data", self.set_wechat_data) - - EventMesh.subscribe("get_aduio_state", self.get_aduio_state) - EventMesh.subscribe("get_send_state", self.get_send_state) - - self.countdown = 1 - self.count_img = 0 - self.play_img_cnt = None - self.play_text = None - self.play_sec = 0 - self.sec_num = 0 - self.countdown_old = 0 - self.press_state = 0 - self.ble_send = 0 - - def get_wechat_data(self,event, msg): - return [self.MXA_MSG,self.wechat_num ,self.wechat_recode_list] - - def set_wechat_data(self, event, msg): - - self.MXA_MSG = msg[0] - self.wechat_num = msg[1] - self.wechat_recode_list = msg[2] - with open("/ext/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd: - ujson.dump(self.wechat_recode_list,fd) - #写编号 - with open("/ext/static/storage_file/wechat_num.txt","w") as fd: - fd.write("{}".format(self.wechat_num)) - print("self.MXA_MSG:{} self.wechat_num:{} self.wechat_recode_list:{}".format(self.MXA_MSG,self.wechat_num,self.wechat_recode_list)) - - def wechat_updata_list_show(self, event, msg): - if (self.wechat_list.has_flag(lv.obj.FLAG.HIDDEN)) == False: - wechat_label.clear_flag(lv.obj.FLAG.HIDDEN) - wechat_label.set_text("接收中") - self.updata_list_show(2) - self.timer.start(1 * 1000, 0, self.reciving) - - - - - def updata_list_show(self,index): - if self.press_state != 1: - if self.wechat_num != 0: - if index == 0: - self.wechat_list.clear_flag(lv.obj.FLAG.HIDDEN) - wechat_label.add_flag(lv.obj.FLAG.HIDDEN) - elif index == 2 or index == 1: - #读取json文件中的键作为label文本; - #print("self.wechat_list.self.wechat_num:{}".format(self.wechat_num)) - - print("self.wechat_recode_list:{}".format(self.wechat_recode_list)) - self.wechat_list.delete()#先删除一次控件 - self.wechat_list = lv.obj(wechat_screen) - self.wechat_list.set_pos(0, 0) - self.wechat_list.set_size(240, 250) - self.wechat_list.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - self.wechat_list.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - self.play_img_cnt = None - if index == 2: - self.wechat_list.add_flag(lv.obj.FLAG.HIDDEN) - j = 1 - if len(self.wechat_recode_list) == self.MXA_MSG: - j = self.wechat_num+1 - print("wechat_num:{} ".format(self.wechat_num)) - for i in range(self.MXA_MSG): - if j > self.MXA_MSG: - j = 1 - key = "%02d"%(j) - - if j > len(self.wechat_recode_list) : - break - j+=1 - - value = self.wechat_recode_list[key] - print("value:{} key:{}".format(value,key)) - - self.startY = 56*i - print("self.startY:{}".format(self.startY)) - if value.find("S:") != -1 or value.find("R:") != -1: - self.msg_tmp = value[2:] - self.msg_tmp = int(self.msg_tmp) - self.startWidth = 55+self.msg_tmp*10 - - elif value.find("T:") != -1:#文字显示 - self.msg_tmp = value[2:] - self.startWidth = 230 - - wechat_btn = lv.btn(self.wechat_list) - # if value.find("R:") != -1: - wechat_btn.set_size(self.startWidth,54) - if value.find("R:") != -1 or value.find("T:") != -1 :#显示文字: - wechat_btn.set_pos(10,self.startY ) - wechat_btn.add_style(style_wechat_s_btn, lv.PART.MAIN | lv.STATE.DEFAULT) - elif value.find("S:") != -1 : - wechat_btn.set_pos(230-self.startWidth,self.startY ) - wechat_btn.add_style(style_wechat_r_btn, lv.PART.MAIN | lv.STATE.DEFAULT) - if value.find("R:") != -1 or value.find("S:") != -1: - wechat_btn.add_event_cb(lambda e: self.play_label(e), - lv.EVENT.CLICKED, None) - - _btn_label1 = lv.label(wechat_btn) - if value.find("R:") != -1: - _btn_label1.set_size(40, 40) - _btn_label1.set_pos(35, 8) - _btn_label1.set_text(str(self.msg_tmp)+'\"') - - elif value.find("S:") != -1: - _btn_label1.set_size(40, 40) - _btn_label1.set_pos(self.startWidth-78, 8) - _btn_label1.set_text(str(self.msg_tmp)+'\"') - elif value.find("T:") != -1: - print("msg_tmp:{}".format(self.msg_tmp)) - _btn_label1.set_size(216, 66) - _btn_label1.set_pos(0, 0) - _btn_label1.set_text(str(self.msg_tmp)) - _btn_label1.set_long_mode(lv.label.LONG.DOT) - - _btn_label1.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - - _btn_label2 = lv.label(wechat_btn) - _btn_label2.set_size(0, 0) - if value.find("R:") != -1: - _btn_label2.set_text('R:'+key) - elif value.find("S:") != -1: - _btn_label2.set_text('S:'+key) - elif value.find("T:") != -1: - _btn_label2.set_text('T:'+key) - - if value.find("R:") != -1 or value.find("S:") != -1: - _btn_img = lv.img(wechat_btn) - _btn_img.set_size(30, 30) - if value.find("R:") != -1: - _btn_img.set_pos(5, 0) - _btn_img.set_src("E:/static/APP/wechat/R_3.png") - elif value.find("S:") != -1: - _btn_img.set_pos(self.startWidth-50, 0) - _btn_img.set_src("E:/static/APP/wechat/S_3.png") - _btn_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - bottom_btn1 = self.wechat_list.get_child(-1) - bottom_btn1.scroll_to_view(lv.ANIM.OFF) - - def initialization(self): - wechat_label.set_text(" ") - wechat_label.add_flag(lv.obj.FLAG.HIDDEN) - wechat_press_label_countdown.add_flag(lv.obj.FLAG.HIDDEN) - self.wechat_list.clear_flag(lv.obj.FLAG.HIDDEN) - #读取json文件中的字典放到self.phonebook中 - #创建btn - self.updata_list_show(1) - self.count_img = 0 - self.play_sec = 0 - self.ble_send = 0 - #按下录音 - def talking(self,e): - self.play_timer.stop() - self.aud.stop() - self.wechat_list.add_flag(lv.obj.FLAG.HIDDEN)#隐藏列表选项方框 - self.countdown = 1 - wechat_label.clear_flag(lv.obj.FLAG.HIDDEN) - wechat_label.set_text("松开发送") - wechat_press_label_countdown.clear_flag(lv.obj.FLAG.HIDDEN) - wechat_press_label_countdown.set_text("{}S".format(str(self.countdown))) - - - self.updata_list_show(2)#不需要显示语音列表 - #按下说话 - if self.wechat_num >= self.MXA_MSG: - self.wechat_num = 0 - self.wechat_num += 1 - print("talking self.wechat_num ...:{} self.MXA_MSG:{}".format(self.wechat_num,self.MXA_MSG)) - self.record_test.start("/ext/static/storage_file/{}.amr".format(self.wechat_num),16) - self.second_timer.start(1000, 1, self.reduce_second) - self.press_state = 1 - self.ble_send = 1 - #松开发送 - def reciving(self,e): - self.updata_list_show(0) - - #松开发送 - def sending(self,e): - if self.press_state == 1: - wechat_label.clear_flag(lv.obj.FLAG.HIDDEN) - wechat_label.set_text("发送中") - wechat_press_label_countdown.add_flag(lv.obj.FLAG.HIDDEN) - wechat_press_label_countdown.set_text(" ") - - if self.countdown >= 15: - self.countdown = 15 - #松开发送数据 - #num.txt为记录的最后编号 - #record.json文件里的json元素为记录编号,json键值:"S:"开头为发送的语音,"R:"为接收的语音,后面跟随语音长度;"T:"为接收的文字信息。 - - #写序号 - self.record_test.stop() #停止錄音 - self.second_timer.stop() #停止计时器 - self.countdown_old = self.countdown - # print("self.countdown :{} self.wechat_num:{}".format(self.countdown,self.wechat_num)) - self.wechat_recode_list["%02d"%(self.wechat_num)] = "S:{}".format(str(self.countdown)) - - with open("/ext/static/storage_file/wechat_num.txt","w") as fd: - fd.write(str(self.wechat_num)) - #读音频amr二进制数据 - - #修改或添加词典键值 - self.press_state = 0 - self.ble_send = 0 - self.timer.start(2 * 1000, 0, self.hide_label) - with open("/ext/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd: - ujson.dump(self.wechat_recode_list,fd) - print("senddata self.wechat_num ...:{}".format(self.wechat_num)) - path = "/ext/static/storage_file/{}.amr".format(self.wechat_num) - with open(path,"rb") as fd: - buf = bytearray(ql_fs.path_getsize(path)) - fd.readinto(buf) - senddata = [self.countdown_old,buf] - EventMesh.publish(constants.PROTOCOL.TK_SEND,senddata) - #隐藏显示文本 显示列表显示框 - - - - self.updata_list_show(2) - - - - def play_img_cb(self,*args): - # print("self.count_img :{} self.play_text:{}".format(self.count_img,self.play_text)) - self.count_img+=1 - if self.count_img > 3: - self.count_img = 1 - if self.play_text == "R:": - self.play_img_cnt.set_src("E:/static/APP/wechat/R_{}.png".format(self.count_img)) - elif self.play_text == "S:": - self.play_img_cnt.set_src("E:/static/APP/wechat/S_{}.png".format(self.count_img)) - - self.sec_num+=1 - if self.sec_num % 2 == 0: - # print("self.play_sec:{}".format(self.play_sec)) - if self.play_sec > 0: - self.play_sec -= 1 - if self.play_sec == 0: - self.play_timer.stop() - if self.play_text == "R:": - self.play_img_cnt.set_src("E:/static/APP/wechat/R_3.png") - elif self.play_text == "S:": - self.play_img_cnt.set_src("E:/static/APP/wechat/S_3.png") - - #点击播放 - def play_label(self,e): - self.sec_num = 0 - # print("play_label self.play_text:{}".format(self.play_text)) - if self.play_text != None and self.play_img_cnt != None: #停止东画还原到3图标 - if self.play_text == "R:": - self.play_img_cnt.set_src("E:/static/APP/wechat/R_3.png") - elif self.play_text == "S:": - self.play_img_cnt.set_src("E:/static/APP/wechat/S_3.png") - - self.count_img = 0 #喇叭动画显示的数量 - play_img = e.get_target() - self.play_img_cnt = play_img.get_child(2) - text = play_img.get_child(1).get_text() - self.play_text = text[0:2] #区分左右喇叭动画显示 "R":左边 "S:"右边 "T:":左边 - - play_img_s = play_img.get_child(0).get_text() - play_img_s = play_img_s.split('"') - play_img_s = play_img_s[0]#获取实际显示秒数 '"'前面实际的秒数 - - if self.play_text == "R:" or self.play_text == "S:": - if self.play_text == "R:": - self.play_sec = 15 - else: - self.play_sec = int(play_img_s) - - self.play_timer.start(500, 1, self.play_img_cb) - # print("play_label self.count_img :{} self.play_text:{} play_img_s:{} self.play_sec:{}".format(self.count_img,self.play_text,play_img_s,self.play_sec)) - - num_amr = play_img.get_child(1).get_text() - num_amr = num_amr.split(':') - num_amr = num_amr[1]#获取实际秒数 - i = int(num_amr) - # print("num:{}".format(i)) - if self.play_text == "R:" or self.play_text == "S:":#过滤掉文字显示 不需要播放音频文件 - self.aud = audio.Audio(0) - self.aud.stop()# - self.aud.play(1, 1, '/ext/static/storage_file/{}.amr'.format(i)) #文件名前面要加上路径 - - #松手2秒后发送数据 - def hide_label(self,*args): - if self.ble_send != 1: - wechat_label.add_flag(lv.obj.FLAG.HIDDEN) - wechat_label.set_text(" ") - self.updata_list_show(0) - - #获取是否在录音 - def get_aduio_state(self, event, msg): - return self.press_state - - def get_send_state(self, event, msg): - return self.ble_send - - def Close(self): - self.play_timer.stop() - self.record_test.stop() #停止錄音 - self.second_timer.stop() #停止计时器 - self.aud.stop() - - def reduce_second(self,*args): - if self.countdown < 15: - self.countdown += 1 - else: - self.countdown = 15 - self.sending(0) - - if self.countdown >= 15: - self.countdown = 15 - wechat_press_label_countdown.set_text("{}S".format(str(self.countdown))) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) -#微聊弹窗 - -wechat_popup_screen = lv.obj() -wechat_popup_screen.center() -wechat_popup_screen.set_size(240, 320) -wechat_popup_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -wechat_popup_title = lv.label(wechat_popup_screen) -wechat_popup_title.set_pos(0, 150) -wechat_popup_title.set_size(240, 40) -wechat_popup_title.set_text("你有新的微聊消息") -wechat_popup_title.set_long_mode(lv.label.LONG.WRAP) -wechat_popup_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -wechat_popup_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -class NewWechatPopupScreen(Screen): - NAME = "wechat_popup" - def __init__(self): - super().__init__() - self.meta = wechat_popup_screen - - def done_left_to_right(self): - EventMesh.publish("wechat_updata_list_show") - EventMesh.publish("load_screen", {"screen": "wechat"}) - - def done_right_to_left(self): - EventMesh.publish("wechat_updata_list_show") - EventMesh.publish("load_screen", {"screen": "wechat"}) - - def done_bottom_to_top(self): - EventMesh.publish("wechat_updata_list_show") - EventMesh.publish("load_screen", {"screen": "wechat"}) - - def done_top_to_bottom(self): - EventMesh.publish("wechat_updata_list_show") - EventMesh.publish("load_screen", {"screen": "wechat"}) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_click(self): - EventMesh.publish("wechat_updata_list_show") - EventMesh.publish("load_screen", {"screen": "wechat"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - - - - -class TK_ProtoCol(ProtoCol): - """微聊""" - TYPE = "TK" - - - def send(self, event, msg): - # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据] - #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据] - arm_data = msg[1] - arm_sec = msg[0] - print("TK_ProtoCol:msgtype:{} arm_sec:{}".format(type(msg),arm_sec)) - - arm = bytearray() - for i in range(len(arm_data)): - if arm_data[i] == 0x7d: - arm.extend(b'\x7d\x01') - elif arm_data[i] == 0x5b : - arm.extend(b'\x7d\x02') - elif arm_data[i] == 0x5d : - arm.extend(b'\x7d\x03') - elif arm_data[i] == 0x2c : - arm.extend(b'\x7d\x04') - elif arm_data[i] == 0x2a : - arm.extend(b'\x7d\x05') - else : - arm.append(arm_data[i]) - - datalen = len(arm) + 4+len(str(arm_sec))+1 - #print("len(str(arm_sec)):{}".format(len(str(arm_sec))+1)) - send_data = bytearray("SZKW*%s*%04X*TKS,%d,"%(self.imei,datalen,arm_sec)) - send_data.extend(arm) - MD5_SIGN = self.pack_MD5_head(send_data) - data = bytearray('[') - data.extend(MD5_SIGN) - data.extend(send_data) - data.extend(']') - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - - @param event: 微聊 - @param msg: 接收到的下行数据 - [SZKW*860132060004322*20BD*TK,#!AMR...] - """ - #print("K_ProtoCol:recv:data:{}".format(msg)) - msg_tmp = msg.decode('ascii') - str = msg_tmp.split('TK,') - # print("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR"))) - if msg_tmp.find("#!AMR") != -1: #是否是服务器下发音频数据 - # print("TK_ProtoCol:recv:datalen{}".format(len(msg))) - arm_data = bytearray(str[1])#获取amr输出 - get_wechat_data = EventMesh.publish("get_wechat_data") - wechat_num = get_wechat_data[1] - MXA_MSG = get_wechat_data[0] - wechat_recode_list = get_wechat_data[2] - # print("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) - - if wechat_num >= MXA_MSG: - wechat_num = 0 - if wechat_num == 0: - wechat_num += 1 - elif wechat_num > 0: - wechat_num += 1 - - #写记录列表 - wechat_recode_list["%02d"%(wechat_num)] = "R:{}".format(3) - EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_num,wechat_recode_list]) - #写语音文件数据 - get_send_state=EventMesh.publish("get_send_state") - if get_send_state != 1: - EventMesh.publish("load_screen", {"screen": "wechat_popup"}) - EventMesh.publish("wechat_updata_list_show") - # path = "/ext/static/storage_file/audio_amr/amr/{}.amr".format(wechat_num) - path = "/ext/static/storage_file/{}.amr".format(wechat_num) - with open(path,"w") as fd: - arm = bytearray() - j = 0 - for i in range(len(arm_data)): - if arm_data[j] == 0x7d and arm_data[j+1] == 0x01: - arm.extend(b'\x7d') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02: - arm.extend(b'\x5b') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03: - arm.extend(b'\x5d') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04: - arm.extend(b'\x2c') - j+=1 - elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05: - arm.extend(b'\x2a') - j+=1 - else : - arm.append(arm_data[j]) - j+=1 - if j >= len(arm_data): - break - fd.write(arm) - - - - -class MESSAGE_ProtoCol(ProtoCol): - """微聊""" - TYPE = "MESSAGE" - - - def send(self, event, msg): - - #[XT*334588000000156*0007*MESSAGE] - send_data = "SZKW*%s*0007*MESSAGE"%(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: 微聊文字 - @param msg: 接收到的下行数据 - """ - msg = msg[1:-1] - - msg_s = msg.decode('ascii') - msg_s = msg_s.split(',') - msg_s = msg_s[1] - # print("msg_tmp:len:{}\r\n data:{}".format(len(msg_s),msg_s)) - - - get_wechat_data = EventMesh.publish("get_wechat_data") - wechat_num = get_wechat_data[1] - MXA_MSG = get_wechat_data[0] - wechat_recode_list = get_wechat_data[2] - # print("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list)) - - if wechat_num >= MXA_MSG: - wechat_num = 0 - if wechat_num == 0: - wechat_num += 1 - elif wechat_num > 0: - wechat_num += 1 - msg_txt = {} - # 0 1 2 3 - # print("msg_tmp:init {}".format(msg_s)) - msg_txt = UnicodeHexStr_To_Utf8Str(msg_s) - # print("msg_txt:{}".format(msg_txt)) - wechat_recode_list["%02d"%(wechat_num)] = "T:{}".format(msg_txt) - EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_num,wechat_recode_list]) - # print("wechat_recode_list:len data:{}".format(wechat_recode_list)) - EventMesh.publish(constants.PROTOCOL.MESSAGE_SEND) - get_send_state=EventMesh.publish("get_send_state") - if get_send_state != 1: - EventMesh.publish("load_screen", {"screen": "wechat_popup"}) - EventMesh.publish("wechat_updata_list_show") - - - - - diff --git a/3.code/1.watch/2.code/btn_device_ec800m.py b/3.code/1.watch/2.code/btn_device_ec800m.py deleted file mode 100644 index 310e0be0..00000000 --- a/3.code/1.watch/2.code/btn_device_ec800m.py +++ /dev/null @@ -1,80 +0,0 @@ -from common import Abstract -import machine -import osTimer -from misc import PowerKey -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(4, 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] == 3) and (l_list[2] == 0): - if l_list[0] == 1: - EventMesh.publish("btn1_press") - else: - pass - # EventMesh.publish("btn1_press") - - - - - 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 deleted file mode 100644 index b99420f4..00000000 --- a/3.code/1.watch/2.code/capacitive_hynitron_cst816d_update.py +++ /dev/null @@ -1,977 +0,0 @@ -""" -*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/code.py b/3.code/1.watch/2.code/code.py deleted file mode 100644 index 6b81d641..00000000 --- a/3.code/1.watch/2.code/code.py +++ /dev/null @@ -1,296 +0,0 @@ -from machine import LCD, Pin -import lvgl as lv -from tp import cst816 - -test = ( - - 0, 0, 0x11, - 2, 0, 120, - - 0, 1, 0x36, - 1, 1, 0x00, - - 0, 1, 0x35, - 1, 1, 0x01, - - 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() - -test1 = bytearray(test) - -test2 = ( - 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, -) -test_invalid = bytearray(test2) - -test3 = ( - 0, 0, 0x28, - 2, 0, 120, - 0, 0, 0x10, -) -test_displayoff = bytearray(test3) - -test4 = ( - 0, 0, 0x11, - 2, 0, 120, - 0, 0, 0x29, -) -test_displayon = bytearray(test4) - -gpio4 = Pin(Pin.GPIO18, Pin.OUT, Pin.PULL_PU, 0) -gpio4.write(1) -lcd.lcd_init(test1, 240, 320, 52000, 1, 4, 0, test_invalid, test_displayon, test_displayoff, None, TESel=True, TEPin=7) -lcd.lcd_clear(0xf800) -gpio5 = Pin(Pin.GPIO17, Pin.OUT, Pin.PULL_PU, 0) -gpio5.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.register() -gpio6 = Pin(Pin.GPIO33, Pin.OUT, Pin.PULL_PU, 0) -gpio6.write(0) - - -# 启动lvgv线程 -lv.tick_inc(5) -lv.task_handler() -print("lvgl init complete") - -# 界面风格1 -style_bar = lv.style_t() -style_bar.init() -style_bar.set_border_width(0) -style_bar.set_radius(0) -style_bar.set_pad_top(0) -style_bar.set_pad_bottom(0) -style_bar.set_pad_left(0) -style_bar.set_pad_right(0) - -screen = lv.obj() - -# Code 39字符集和对应的二进制码 -code_39_dict = {'0': '0001101000', '1': '1001000010', '2': '0011000010', '3': '1011000000', '4': '0001100010', - '5': '1001100000', '6': '0011100000', '7': '0001001010', '8': '1001001000', '9': '0011001000', - 'A': '1000010010', 'B': '0010010010', 'C': '1010010000', 'D': '0000110010', 'E': '1000110000', - 'F': '0010110000', 'G': '0000011010', 'H': '1000011000', 'I': '0010011000', 'J': '0000111000', - 'K': '1000000110', 'L': '0010000110', 'M': '1010000100', 'N': '0000100110', 'O': '1000100100', - 'P': '0010100100', 'Q': '0000001110', 'R': '1000001100', 'S': '0010001100', 'T': '0000101100', - 'U': '1100000010', 'V': '0110000010', 'W': '1110000000', 'X': '0100100010', 'Y': '1100100000', - 'Z': '0110100000', '-': '0100001010', '.': '1100001000', ' ': '0110001000', '*': '0100101000', - '$': '0101010000', '/': '0101000100', '+': '0100010100', '%': '0001010100'} - -# Code 39条形码的起始和结束符 -code_39_start = '0100101000' -code_39_end = '010010100' #结束符结尾'0'去掉 - -# Code 39条形码的宽度系数 -code_39_narrow = 1 -code_39_wide = 3 - - -def code_39_encode(data): - """将数据编码为Code 39条形码对应的二进制码""" - result = '' - for char in data: - try: - result += code_39_dict[char] - except Exception as e: - print("your data contains illegal code!") - return None - return result - - -def code_39_generate_binary(data): - """生成Code 39条形码对应的二进制码""" - encoded_data = code_39_encode(data) - if encoded_data: - # 添加起始和结束符 - encoded_data = code_39_start + encoded_data + code_39_end - return encoded_data - else: - return None - - -def code_39_generate_barcode(screen, data, width=180, height=80): - """生成Code 39条形码""" - left_curr_line = 0 - - # 删除上次的container - old_container = screen.get_child(-1) - if old_container: - old_container.delete() - - # 生成二进制码 - binary_data = code_39_generate_binary(data) - if not binary_data: - return - print("binary_data is ",binary_data) - - # 在LVGL中创建一个容器对象 - container = lv.obj(screen) - # container.set_size(width, height) - container.add_style(style_bar,lv.PART.MAIN | lv.STATE.DEFAULT) - container.center() - - # 计算每个条的宽度 - bar_width = width // (len(binary_data)) - - # 按照二进制码中的1和0,分别创建LVGL矩形对象 - for i in range(len(binary_data)): - if i % 2 == 0: - # 创建一个黑色矩形 - bar = lv.obj(container) - bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT) - if binary_data[i] == '1': - real_width = bar_width * code_39_wide - bar.set_size(real_width, height) - else: - real_width = bar_width * code_39_narrow - bar.set_size(real_width, height) - bar.align(lv.ALIGN.TOP_LEFT, left_curr_line, 0) - bar.set_style_bg_color(lv.color_make(0x00, 0x00, 0x00), lv.PART.MAIN | lv.STATE.DEFAULT) - left_curr_line += real_width - else: - # 创建一个白色矩形 - bar = lv.obj(container) - bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT) - if binary_data[i] == '1': - real_width = bar_width * code_39_wide - bar.set_size(real_width, height) - else: - real_width = bar_width * code_39_narrow - bar.set_size(real_width, height) - bar.align(lv.ALIGN.TOP_LEFT, left_curr_line, 0) - bar.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF), lv.PART.MAIN | lv.STATE.DEFAULT) - left_curr_line += real_width - - container.set_size(left_curr_line, height) - - -if __name__ == "__main__": - code_39_generate_barcode(screen,"A123 321") - lv.scr_load(screen) - diff --git a/3.code/1.watch/2.code/common.py b/3.code/1.watch/2.code/common.py deleted file mode 100644 index 04489e7b..00000000 --- a/3.code/1.watch/2.code/common.py +++ /dev/null @@ -1,145 +0,0 @@ -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 deleted file mode 100644 index ba575e79..00000000 --- a/3.code/1.watch/2.code/constants.py +++ /dev/null @@ -1,103 +0,0 @@ -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" - - PHL_SEND = "PHL_SEND" - PHL_RECV = "PHL_RECV" - - TK_SEND = "TK_SEND" - TK_RECV = "TK_RECV" - - MESSAGE_SEND = "MESSAGE_SEND" - MESSAGE_RECV = "MESSAGE_RECV" - - WT_SEND = "WT_SEND" - WT_RECV = "WT_RECV" - - REMIND_SEND = "REMIND_SEND" - REMIND_RECV = "REMIND_RECV" - - HRTSTART_SEND = "hrtstart_SEND" - HRTSTART_RECV = "hrtstart_RECV" - - HEART_SEND = "heart_SEND" - HEART_RECV = "heart_RECV" - - OXYGEN_SEND = "oxygen_SEND" - OXYGEN_RECV = "oxygen_RECV" - - OXSTART_SEND = "oxstart_SEND" - OXSTART_RECV = "oxstart_RECV" - - TEMP_SEND = "temp_SEND" - TEMP_RECV = "temp_RECV" - - DLT_SEND = "DLT_SEND" - DLT_RECV = "DLT_RECV" - - UPLOAD_SEND = "UPLOAD_SEND" - UPLOAD_RECV = "UPLOAD_RECV" - - CENTER_SEND = "CENTER_SEND" - CENTER_RECV = "CENTER_RECV" - - MONITOR_SEND = "MONITOR_SEND" - MONITOR_RECV = "MONITOR_RECV" - - SOS_SEND = "SOS_SEND" - SOS_RECV = "SOS_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" - GET_HEART = "GET_HEART" - STOP_HEART = "STOP_HEART" - START_BLOOD_OXYGEN = "STARTT_BLOOD_OXYGEN" - GET_BLOOD_OXYGEN = "GET_BLOOD_OXYGEN" - STOP_BLOOD_OXYGEN = "STOP_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 deleted file mode 100644 index 54b7ad25..00000000 --- a/3.code/1.watch/2.code/initTP.py +++ /dev/null @@ -1,192 +0,0 @@ -import log -from machine import I2C -import utime -from machine import Pin -import uos - -# import capacitive_hynitron_cst816d_update_new -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.FAST_MODE) - cmd = [0] - - if -1 == i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x03]), 2, bytearray(cmd), 1): - return -1 - utime.sleep_ms(500)#这里延时太短会读错checksum - - r_data = bytearray(2) - if -1 == i2c_obj.read(TP_HYN_I2C_UPDATE_READ_ADDR>>1, bytearray([0xa0,0x08]), 2, r_data, 2, 0): - return -1 - check_sum = (r_data[1] << 8) | r_data[0] - print("check_sum的值为:",check_sum) - return check_sum -#--------------------------------------------------------------------- -# GPIO_ResetTP -#--------------------------------------------------------------------- -def GPIO_ResetTP(): - - print("GPIO_ResetTP") - - 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") - if -1 == cst816d_enter_bootmode(): - return -1 - - sum_len = 0 - cmd = [0,0] - global x - while 1: - x += 1 - if sum_len >= length: - print("sum_len >= length,退出循环") - return - a = startAddr&0xFF - cmd[0]=a - b = startAddr>>8 - cmd[1]=b - i2c_obj = I2C(I2C.I2C2, I2C.FAST_MODE) - - ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x14]), 2, bytearray(cmd), 2) - utime.sleep_ms(100) - - ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x18]), 2, bytearray(data), PER_LEN) - - utime.sleep_ms(100) - - cmd[0] = 0xEE - ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x04]), 2, bytearray(cmd), 1) - - utime.sleep_ms(100) - - 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_ms(50) - - if r_data[0] == 0x55: - print("r_data[0] = 0x55,break") - break - - startAddr = startAddr + PER_LEN - del data[0:PER_LEN] - sum_len = sum_len + PER_LEN - -#--------------------------------------------------------------------- -# cst816d_enter_bootmode -#--------------------------------------------------------------------- -def cst816d_enter_bootmode(): - - GPIO_ResetTP() - i2c_obj = I2C(I2C.I2C2, I2C.FAST_MODE) - - cmd = [0xAB] - #进入boot模式 - retrycnt = 10 - global y - for i in range (retrycnt): - y += 1 - if 0 == i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x01]), 2, bytearray(cmd), 1): - utime.sleep_ms(100) - 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(100) - else: - if 0xc1 == r_data[0]: - utime.sleep_ms(100) - return 0 - else: - print("boot模式进入失败") - - return -1 -#--------------------------------------------------------------------- -# ctp_hynitron_update -#--------------------------------------------------------------------- -def ctp_hynitron_update(): - - # 初始化固件数组和数组长度 - p_app_bin = [] - app_bin_len = 0 - - #进入boot模式 - if -1 == cst816d_enter_bootmode(): - return - - # 获取固件数组 - # p_app_bin = capacitive_hynitron_cst816d_update_new.app_bin_816d - p_app_bin = capacitive_hynitron_cst816d_update.app_bin_816d - - # 获取固件数组的长度 - app_bin_len = len(p_app_bin) - - if app_bin_len > 10: - startAddr = p_app_bin[1] - length = p_app_bin[3] - checksum = p_app_bin[5] #a8 78 - - 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) - - - #检查checksum - sum_now = cst816d_read_checksum() - if sum_now != checksum: - print("固件包checksum不相同!") - - del p_app_bin[0:6] - cst816d_update(startAddr, length, p_app_bin) - - #升级后再次确认checksum - if checksum == cst816d_read_checksum(): - print("固件升级成功!") - - elif checksum == sum_now: - print("固件包checksum相同,退出") - - -#--------------------------------------------------------------------- -# HYN_Initial -#--------------------------------------------------------------------- -def HYN_Initial(): - - GPIO_ResetTP() - - ctp_hynitron_update() - - GPIO_ResetTP() - - - - - - diff --git a/3.code/1.watch/2.code/lcd.py b/3.code/1.watch/2.code/lcd.py deleted file mode 100644 index 5dcd488c..00000000 --- a/3.code/1.watch/2.code/lcd.py +++ /dev/null @@ -1,234 +0,0 @@ -import lvgl as lv -from machine import LCD, Pin -from tp import cst816 -import _thread -import utime -import EventMesh -from misc import PWM -import initTP - -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) -# CST816初始化 -initTP.HYN_Initial() -tp_cst816 = cst816(i2c_no = 2,irq=33, reset=32) -tp_cst816.activate() -tp_cst816.init() -print("cst816 init...") -from btn_device_ec800m import BtnDevice -btn_device = BtnDevice(tp_cst816) -btn_device.start() - -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 = 17) -# gpio_backlight = Pin(Pin.GPIO37, Pin.OUT, Pin.PULL_DISABLE, 0) -# gpio_backlight.write(1) -PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 0, 1) -PWM_backlight.open() - -LCD_SIZE_W = 240 -LCD_SIZE_H = 320 -# pwm.close() -# 初始化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, None, 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() - - -# 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() -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_40 = lv.style_t() -style_font_youyuan_40.init() -style_font_youyuan_40.set_text_color(lv.color_make(0xff, 0xff, 0xff)) -style_font_youyuan_40.set_text_font_v2("font_40.bin",40,0) - -power_on_screen = lv.obj() -power_on_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -power_on_label = lv.label(power_on_screen) -power_on_label.set_text("WELCOME") -power_on_label.align(lv.ALIGN.CENTER, 0, 0) -power_on_label.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) -print("power_on_screen init...") -lv.scr_load(power_on_screen) -utime.sleep_ms(1000) -print("power_on_screen end...") -PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 1) -PWM_backlight.open() diff --git a/3.code/1.watch/2.code/location.py b/3.code/1.watch/2.code/location.py deleted file mode 100644 index b546fafb..00000000 --- a/3.code/1.watch/2.code/location.py +++ /dev/null @@ -1,1024 +0,0 @@ -# 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): - 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_4.py b/3.code/1.watch/2.code/main_4.py deleted file mode 100644 index 2f872f86..00000000 --- a/3.code/1.watch/2.code/main_4.py +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index 4eb9b25d..00000000 --- a/3.code/1.watch/2.code/main_t.py +++ /dev/null @@ -1,129 +0,0 @@ -import EventMesh -from common import Abstract -from lcd import gpio_backlight,tp_cst816 -from 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 ui as _ui - from protocol import LK_ProtoCol,PING_ProtoCol, CR_ProtoCol,UD_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,ProtoColResolver - import mgr as mgr - import ui as _ui - from mgr import ConfigStoreManager, DeviceInfoManager, LocationManager, SockManager, \ - NetManager, BatteryManager - from Alipay import Alipay - from 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.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.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": "main_menu"}) - diff --git a/3.code/1.watch/2.code/mgr.py b/3.code/1.watch/2.code/mgr.py deleted file mode 100644 index 98bf563e..00000000 --- a/3.code/1.watch/2.code/mgr.py +++ /dev/null @@ -1,2224 +0,0 @@ -from common import Abstract, LogAdapter -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 -import constants -import sms -from common import Lock, Abstract, LogAdapter -from location import GPS, GPSMatch,CellLocator -from misc import USB, Power, ADC -from machine import ExtInt, Pin,Timer,RTC,UART -import EventMesh -import audio -from machine import I2C -from Gsensor import SC7A20 -from Hsensor import GH3018 -import quecgnss -import wifiScan -import math -import voiceCall -from misc import PWM - -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): - print('voicecall iinfo:{}'.format(args)) - if args[0] == 10: - get_UI_high_priority = EventMesh.publish("get_UI_high_priority")#如果在拨出去或者通话中屏蔽来电 - if get_UI_high_priority == 1: - EventMesh.publish("set_interrup_incall",1) - return - print('voicecall incoming call, PhoneNO.: ', args[6]) - size_len = len(str(args[6])) - tmp = [] - tmp = args[6] - find_num = tmp[0] - b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了 判断号码是否大于11位数,如果大于11位数 并且第一个字符是数字就按照最后11位做存储 - - if b == True and size_len > 11: - tmp = tmp[size_len-11:] - EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(tmp)}) - - elif args[0] == 11: - EventMesh.publish("set_UI_high_priority",0) - sos_flag = EventMesh.publish("get_sos_flag") - if sos_flag == 1: - sos_flag = 0 - EventMesh.publish("set_sos_flag",0) - - print('voicecall connected, PhoneNO.: ', args[6]) - size_len = len(str(args[6])) - tmp = [] - tmp = args[6] - find_num = tmp[0] - b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了 - if b == True and size_len > 11: - tmp = tmp[size_len-11:] - EventMesh.publish("load_screen", {"screen": "on_call","meta":str(tmp)}) - - elif args[0] == 12: - set_interrup_call = EventMesh.publish("get_interrup_incall")#打断这次不需要来电的ui事件 以免通话中退出当前界面进不去了 - if set_interrup_call == 1: - EventMesh.publish("set_interrup_incall",0) - return - - EventMesh.publish("set_interrup_incall",0) - EventMesh.publish("set_UI_high_priority",0) - print('voicecall disconnect') - EventMesh.publish("load_screen", {"screen": "main_menu"}) - sos_flag = EventMesh.publish("get_sos_flag") - if sos_flag == 0: - EventMesh.publish("set_sos_num",0) - else: - num = EventMesh.publish("get_sos_num") - number = EventMesh.publish("get_dial_sos_number") - if len(number) > 0: - if num == None: - num = 0 - num+=1 - num_len = 0 - - if len(number) == 1: - num_len = len(number) - elif len(number) == 2: - num_len = len(number)+1 - elif len(number) == 3: - num_len = len(number)+2 - # print("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len)) - if num > num_len : - EventMesh.publish("set_sos_flag",0) - EventMesh.publish("set_sos_num",0) - else: - # print("number:{} number_len :{}".format(number,len(number))) - EventMesh.publish("set_sos_num",num) - if len(number) == 1: - EventMesh.publish("set_callnumer_cb",number[0]) - print("phone 1") - elif len(number) == 2: - if num == 1 or num == 3: - print("phone 2") - EventMesh.publish("set_callnumer_cb",number[1]) - elif num == 2: - print("phone 3") - EventMesh.publish("set_callnumer_cb",number[0]) - elif len(number) == 3: - if num == 1 or num == 4: - EventMesh.publish("set_callnumer_cb",number[1]) - print("phone 4") - elif num == 2 or num == 5: - print("phone 5") - EventMesh.publish("set_callnumer_cb",number[2]) - elif num == 3: - print("phone 6") - EventMesh.publish("set_callnumer_cb",number[0]) - print('voicecall disconnect end') - - - elif args[0] == 13: - print('voicecall is waiting, PhoneNO.: ', args[6]) - elif args[0] == 14: - - print('voicecall dialing, PhoneNO.: ', args[6]) - EventMesh.publish("load_screen", {"screen": "dialing"}) - - 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.HR_time = 0 - self.SENSOR_time = 0 - self.HR_state = 0 - self.HR_Onestate = 0 - self.get_hr_state = 0 - self.get_spo2_state = 0 - self.set_hsenor_crt = 0 - self.HR_OneTime = 0 - self.Hr_Need_Open = 0 - self.Spo2_Need_Open = 0 - self.bat_time = 0 - self.sms_full_flag = 0 - self.clear_step = 0 - - self.old_time = 0 - self.UD_time = 0 - self.upload_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() - # #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.') - - self.i2c0 = I2C(I2C.I2C0, I2C.STANDARD_MODE) - self.stop_temp( None, None) - - 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) - EventMesh.subscribe(constants.EVENT.STOP_BLOOD_OXYGEN, self.stop_blood_oxygen) - EventMesh.subscribe(constants.EVENT.STOP_HEART, self.stop_heart) - EventMesh.subscribe(constants.EVENT.GET_BLOOD_OXYGEN, self.get_blood_oxygen) - EventMesh.subscribe(constants.EVENT.GET_HEART, self.get_heart) - - EventMesh.subscribe(constants.EVENT.START_TEMP, self.start_temp) - EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp) - EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp) - - 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) - print("date_tmp......01....{} time_tmp:{}\r\n".format(date_tmp,time_tmp)) - - if math.fabs(time_tmp - self.KA_time) > 7*60: #7分钟一次心跳 - self.KA_time = time_tmp - EventMesh.publish(constants.PROTOCOL.KA_SEND) - self.upload_time = EventMesh.publish("get_upload_data") - #print("self.upload_time:{} math.fabs(time_tmp - self.UD_time):{}".format(self.upload_time,math.fabs(time_tmp - self.UD_time))) - if self.upload_time != None: - if math.fabs(time_tmp - self.UD_time) > self.upload_time: #7分钟一次定位 - self.UD_time = time_tmp - if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1: - EventMesh.publish(constants.EVENT.START_LOCATION) #开始定位 - EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count()) - - hr_time = EventMesh.publish("get_time_hr_spo2")#获取时间是否大于0 - - self.get_hr_state = EventMesh.publish("get_hr_state") - self.get_spo2_state = EventMesh.publish("get_spo2_state") - - hour = 0 - min = 0 - hour = date_tmp[3] - min = date_tmp[4] - - if hour == 0:#清步数 - if min <= 1: - if self.clear_step == 0: - step = EventMesh.publish("get_old_step_value") - if step > 0: - EventMesh.publish("set_old_step_value",0) - self.gsensor.reset_step() - self.clear_step = 1 - else: - if self.clear_step == 1: - self.clear_step = 0 - else: - if self.clear_step == 1: - self.clear_step = 0 - - #电量小于20% 5分钟提醒一次 - battery = EventMesh.publish("screen_get_battery") - self.bat_time+=10 - # print("date_tmp:{} self.bat_time:{}".format(date_tmp,self.bat_time)) - - if self.bat_time > 5*60: - self.bat_time = 0 - if battery[1] == 20: - EventMesh.publish("load_screen", {"screen": "LOW_POWER"}) - - #消息已满 - msg_nums = sms.getMsgNums() #获取短信条数 - self.sms_full_flag+=10 - if self.sms_full_flag >= 120: - self.sms_full_flag=0 - if msg_nums >= 50: - EventMesh.publish("load_screen", {"screen": "message_full"}) - - - if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 or battery[1] != 1: - if hr_time != None: - # print("hr......01....{}\r\n".format(hr_time)) - if hr_time > 0: - #print("get_hr_state:{} get_spo2_state:{} self.old_time:{} hr_time:{}".format(self.get_hr_state,self.get_spo2_state,self.old_time,hr_time)) - if self.get_hr_state != 1 and self.get_spo2_state != 1: - if self.get_hr_state == 0 and self.get_spo2_state == 0: - if self.HR_state == 0 or self.HR_state == 3: - self.HR_Onestate = 0 - self.HR_OneTime = 0 - - if self.old_time != hr_time:#重复修改测量间隔时间 - self.SENSOR_time = time_tmp#防止改变时间的时候正在开启测量突然10s就停止测量 - if self.get_hr_state == 2 and self.HR_state == 1:#自动检测的心率还在测量立马关了测试 - heart_value = EventMesh.publish(constants.EVENT.GET_HEART) - if heart_value > 50 and heart_value != None: - EventMesh.publish("set_old_hr_data",heart_value) - EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value) - EventMesh.publish(constants.EVENT.STOP_HEART) - self.HR_state = 0 - elif self.get_spo2_state == 2 and self.HR_state == 2: - self.HR_state = 0 - spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN) - if spo2_value > 85 and spo2_value != None: - EventMesh.publish("set_old_spo2_data",spo2_value) - EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value) - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) - self.old_time = hr_time - - if self.HR_state == 3 or self.HR_state == 0:# - if (time_tmp - self.SENSOR_time) >= hr_time: - if self.get_spo2_state == 3 or self.get_hr_state == 3:#单次测量没有完毕优先测量间隔时间测量的 - if self.get_hr_state == 3: - EventMesh.publish(constants.EVENT.STOP_HEART) - heart_value = EventMesh.publish(constants.EVENT.GET_HEART) - if heart_value > 50 and heart_value != None: - EventMesh.publish("set_old_hr_data",heart_value) - EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value) - - elif self.get_spo2_state == 3: - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) - spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN) - if spo2_value > 85 and spo2_value != None: - EventMesh.publish("set_old_spo2_data",spo2_value) - EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value) - - self.HR_state = 0 - self.SENSOR_time = time_tmp - self.SENSOR_time = time_tmp - self.HR_state = 0 - - #print("time_tmp :{} self.SENSOR_time :{} time_tmp - self.SENSOR_time:{} self.HR_state:{}".format(time_tmp,self.SENSOR_time,time_tmp - self.SENSOR_time,self.HR_state)) - if (time_tmp - self.SENSOR_time) == 0 and self.HR_state == 0: - print("START_HEART:1") - EventMesh.publish("set_hr_state",2)#2代表后台进入测试 - EventMesh.publish(constants.EVENT.START_HEART) - self.HR_state = 1 - self.HR_Onestate = 0 - self.HR_OneTime = 0 - elif (time_tmp - self.SENSOR_time) >= 60 and self.HR_state == 1: - EventMesh.publish("set_hr_state",0)#2代表后台进入测试 - EventMesh.publish(constants.EVENT.STOP_HEART) - heart_value = EventMesh.publish(constants.EVENT.GET_HEART) - print("heart_value:{}".format(heart_value)) - if heart_value > 50 and heart_value != None: - EventMesh.publish("set_old_hr_data",heart_value) - EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据 - #获取心率数据上传数据app - print("STOP_HEART:") - EventMesh.publish("set_spo2_state",2)#2代表后台进入血氧测试 - EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧 - print("START_BLOOD_OXYGEN:") - self.HR_state = 2 - elif (time_tmp - self.SENSOR_time) >= 120 and self.HR_state == 2: - print("STOP_BLOOD_OXYGEN:") - EventMesh.publish("set_spo2_state",0)#2代表后台进入血氧测试 - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)#停止血氧测试 - spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN) - print("spo2_value:{}".format(spo2_value)) - if spo2_value > 85 and spo2_value != None: - EventMesh.publish("set_old_spo2_data",spo2_value) - EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value) - self.HR_state = 3 - else: - self.HR_state = 0 - self.old_time = hr_time - - if self.HR_state == 3 or self.HR_state == 0:#只有不在测量的时候才测单次的 - if self.get_spo2_state == 3 or self.get_hr_state == 3:#单次测量 - self.HR_state = 0 - self.HR_OneTime+=1 - if self.HR_OneTime == 1 and self.HR_Onestate == 0: - print("hr..........\r\n") - if self.get_hr_state == 3: - self.Hr_Need_Open = 1 - EventMesh.publish("set_hr_state",3)#2代表后台进入测试 - EventMesh.publish(constants.EVENT.START_HEART) - else: - self.Hr_Need_Open = 0 - - if self.get_spo2_state == 3 and self.Hr_Need_Open == 0: - self.Spo2_Need_Open = 1 - EventMesh.publish("set_spo2_state",3)#2代表后台进入测试 - EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧 - else: - self.Spo2_Need_Open = 0 - self.HR_Onestate = 1 - # print("self.HR_Onestate....3..:{} {} {} {} {}".format(self.HR_Onestate,self.get_hr_state,self.get_spo2_state,self.Hr_Need_Open,self.Spo2_Need_Open)) - elif self.HR_OneTime > 6 and self.HR_Onestate == 1: - # print("self.HR_Onestate...4....:{} {} {} {} {}".format(self.HR_Onestate,self.get_hr_state,self.get_spo2_state,self.Hr_Need_Open,self.Spo2_Need_Open)) - if self.Hr_Need_Open == 1:#需要关闭心率测量 - EventMesh.publish(constants.EVENT.STOP_HEART) - heart_value = EventMesh.publish(constants.EVENT.GET_HEART) - if heart_value > 50 and heart_value != None: - EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据 - EventMesh.publish("set_old_hr_data",heart_value) - - if self.Spo2_Need_Open == 0 and self.get_spo2_state == 3: - EventMesh.publish("set_spo2_state",3)#2代表后台进入血氧测试 - EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧 - - self.HR_Onestate = 2 - self.set_hsenor_crt = 2#血氧关闭 - else: - self.HR_Onestate = 0 - self.HR_OneTime = 0 - self.set_hsenor_crt = 0# - - EventMesh.publish("set_hr_state",0)#2代表后台进入血氧测试 - EventMesh.publish("set_spo2_state",0)#2代表后台进入血氧测试 - else: - if self.Spo2_Need_Open == 1:#停止测试血氧 - EventMesh.publish("set_spo2_state",0)#2代表后台进入血氧测试 - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)#K开血氧 - spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN) - - if spo2_value > 85 and spo2_value != None: - EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value) - EventMesh.publish("set_old_spo2_data",spo2_value) - if self.Hr_Need_Open == 0 and self.get_hr_state == 3: - EventMesh.publish("set_hr_state",3)#2代表后台进入测试 - EventMesh.publish(constants.EVENT.START_HEART) - self.HR_Onestate = 2 - self.set_hsenor_crt = 1#心率 - else: - self.HR_Onestate = 0 - self.HR_OneTime = 0 - self.set_hsenor_crt = 2#血氧关闭 - - - elif self.HR_OneTime > 6+6 and self.HR_Onestate == 2: - print("HR_OneTime:....05") - if self.set_hsenor_crt == 2: - EventMesh.publish("set_spo2_state",0)#2代表后台进入血氧测试 - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)#停止血氧测试 - spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN) - if spo2_value > 85 and spo2_value != None: - EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value) - EventMesh.publish("set_old_spo2_data",spo2_value) - elif self.set_hsenor_crt == 1: - EventMesh.publish("set_hr_state",0)#0代表g关闭测试 - EventMesh.publish(constants.EVENT.STOP_HEART) - heart_value = EventMesh.publish(constants.EVENT.GET_HEART) - if heart_value > 50 and heart_value != None: - EventMesh.publish("set_old_hr_data",heart_value) - EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据 - self.HR_Onestate = 0 - else: - self.HR_Onestate = 0 - self.HR_OneTime = 0 - else: - #print("hr......01....{} {} self.HR_Onestate {} {}".format(self.get_hr_state,self.get_spo2_state,self.HR_OneTime,self.HR_Onestate)) - self.SENSOR_time = time_tmp#进入最后一次的时间戳 - - if self.get_hr_state != 1 and self.get_spo2_state != 1:#没有设置间隔时间单次测量 - if self.get_spo2_state == 3 or self.get_hr_state == 3:#单次测量 - self.HR_state = 0 - self.HR_OneTime+=1 - if self.HR_OneTime == 1 and self.HR_Onestate == 0: - if self.get_hr_state == 3: - self.Hr_Need_Open = 1 - EventMesh.publish("set_hr_state",3)#2代表后台进入测试 - EventMesh.publish(constants.EVENT.START_HEART) - else: - self.Hr_Need_Open = 0 - - if self.get_spo2_state == 3 and self.Hr_Need_Open == 0: - self.Spo2_Need_Open = 1 - EventMesh.publish("set_spo2_state",3)#2代表后台进入测试 - EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧 - else: - self.Spo2_Need_Open = 0 - self.HR_Onestate = 1 - - elif self.HR_OneTime > 6 and self.HR_Onestate == 1: - print("stop_heart Onec ") - if self.Hr_Need_Open == 1:#需要关闭心率测量 - EventMesh.publish(constants.EVENT.STOP_HEART) - heart_value = EventMesh.publish(constants.EVENT.GET_HEART) - print("stop_heart heart_value:{}".format(heart_value)) - if heart_value > 50 and heart_value != None: - EventMesh.publish("set_old_hr_data",heart_value) - EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据 - if self.Spo2_Need_Open == 0 and self.get_spo2_state == 3: - EventMesh.publish("set_spo2_state",3)#2代表后台进入血氧测试 - EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧 - self.HR_Onestate = 2 - self.set_hsenor_crt = 2#血氧关闭 - else: - self.HR_Onestate = 0 - self.HR_OneTime = 0 - self.set_hsenor_crt = 0# - EventMesh.publish("set_hr_state",0)#2代表后台进入血氧测试 - EventMesh.publish("set_spo2_state",0)#2代表后台进入血氧测试 - else: - if self.Spo2_Need_Open == 1:#停止测试血氧 - EventMesh.publish("set_spo2_state",0)#2代表后台进入血氧测试 - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)#K开血氧 - spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN) - print("spo2_value:{}.......01..".format(spo2_value)) - if spo2_value > 85 and spo2_value != None: - EventMesh.publish("set_old_spo2_data",spo2_value) - EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value) - if self.Hr_Need_Open == 0 and self.get_hr_state == 3: - EventMesh.publish("set_hr_state",3)#2代表后台进入测试 - EventMesh.publish(constants.EVENT.START_HEART) - self.HR_Onestate = 2 - self.set_hsenor_crt = 1#心率 - else: - self.HR_Onestate = 0 - self.HR_OneTime = 0 - self.set_hsenor_crt = 2#血氧关闭 - print("STOP_BLOOD_OXYGEN:....06.....") - - elif self.HR_OneTime > 6+6 and self.HR_Onestate == 2: - if self.set_hsenor_crt == 2: - EventMesh.publish("set_spo2_state",0)#2代表后台进入血氧测试 - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)#停止血氧测试 - spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN) - if spo2_value > 85 and spo2_value != None: - EventMesh.publish("set_old_spo2_data",spo2_value) - EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value) - elif self.set_hsenor_crt == 1: - EventMesh.publish("set_hr_state",0)#0代表g关闭测试 - EventMesh.publish(constants.EVENT.STOP_HEART) - heart_value = EventMesh.publish(constants.EVENT.GET_HEART) - if heart_value > 50 and heart_value != None: - EventMesh.publish("set_old_hr_data",heart_value) - EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据 - self.HR_Onestate = 0 - else: - self.HR_Onestate = 0 - self.HR_OneTime = 0 - else: - if self.get_hr_state != 0 or self.get_spo2_state != 0:#3单次测量 - if self.get_hr_state != 0: - EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 - EventMesh.publish(constants.EVENT.STOP_HEART) - elif self.get_spo2_state != 0: - EventMesh.publish("set_spo2_state",0)#2代表后台进入测试 - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) - self.SENSOR_time = time_tmp - self.HR_Onestate = 0 - self.HR_OneTime = 0 - self.HR_state = 0 - self.old_time = 0 - self.set_hsenor_crt = 0 - - 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])) - year = ("%04då¹´" % (rtc_time[0])) - week = ("星期%s"%(self.get_week(rtc_time[3]))) - week_data = 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,year,week_data] - #时分,上午下午,日期,星期,å¹´ 星期 - return result - - def get_step_count(self, event=None, msg=None): - """ - 获取步数 - """ - XYZ = self.gsensor.get_x_y_z() - tmp = 0 - - tmp = self.gsensor.get_step() - # print("x:%d,y:%d,z:%d tmp %d",XYZ[0],XYZ[1],XYZ[2],tmp) - self.step[0]= tmp - self.step[1] = XYZ[0] - self.step[2] = XYZ[1] - self.step[3] = XYZ[2] - - 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.jpg" - elif temp <= 3600: - vbat = 40 #"E:/vbat_40.jpg" - elif temp <= 3800: - vbat = 60 #"E:/vbat_60.jpg" - elif temp <= 4000: - vbat = 80 #"E:/vbat_80.jpg" - else: - vbat = 100 #"E:/vbat_100.jpg" - - 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() - - def start_heart(self, topic, msg): - print("start_heart!!!") - self.hsensor.open_heart() - - def stop_blood_oxygen(self, topic, msg): - print("stop_blood_oxygen!!!") - self.hsensor.close() - - def stop_heart(self, topic, msg): - print("stop_heart!!!") - self.hsensor.close() - - def get_blood_oxygen(self, topic, msg): - data = self.hsensor.get_all_data() - return data[1] - - def get_heart(self, topic, msg): - data = self.hsensor.get_all_data() - return data[0] - - - def start_temp(self, topic, msg): - WHO_AM_I = bytearray([0x01, 0]) - I2C_SLAVE_ADDR = 0x49 - r_data = bytearray(2) - data = bytearray([0x61A0, 0]) # 唤醒 - return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2) - def stop_temp(self, topic, msg): - WHO_AM_I = bytearray([0x01, 0]) - I2C_SLAVE_ADDR = 0x49 - r_data = bytearray(2) - data = bytearray([0x60A0, 0]) #休眠 - return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2) - - def get_temp(self, topic, msg): - WHO_AM_I = bytearray([0x00, 0]) - I2C_SLAVE_ADDR = 0x49 - r_data = bytearray(2) - self.i2c0.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 2, 0) - #print("temp_data:{}".format(r_data)) - temp_s = ((r_data[0]<<8) | (r_data[1]))>>4 - #print("temp_s:{}".format(temp_s)) - temp_data = temp_s * 0.0625 - #print("temp_data:{}".format(temp_data)) - return temp_data - - - - 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): - print("TCP:send data:{}".format(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 data[-1] != 0x5d and len(data)<20*1024: #']': - continue - self.connect_tmp = 1 #有数据,就认为是连接状态 - print("TCP:recv: data:{}".format(data)) - EventMesh.publish(constants.EVENT.SET_CONNECT, 1) - data_str = data.decode('ascii') - data_str = data_str.split(']') - if len(data_str) < 3 : - self.resolver.handler(data) - else : - for i in range(len(data_str)): - self.resolver.handler(data_str[i].decode("utf-8")) - 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 - self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭 - @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) - if msg != None : - self.location_type = msg - else : - self.location_type = 0 - - 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): - data = "" - self.location_timer_count = self.location_timer_count +1 - self.location_check_data_timer_count = self.location_check_data_timer_count+1 - - match_gga_data = [] - match_gsv_data = [] - - if self.location_check_data_timer_count > 2 :#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 : #有数据 - match_gga_data = self.match.GxGGA(data[1]).split(",") - match_gsv_data = self.match.GxGSV(data[1]).split(",") - 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.location_type == 1: #测试模式 - EventMesh.publish("PUSH_LOCATION_DATA", [data,self.wifi_data,self.cell_data]) - elif self.location_type == 0: #正常模式 - if self.gps_data != [] or self.location_timer_count > 40: #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)#关闭定位 - - if len(match_gsv_data) >= 3: - #print("match_gsv_data[3]:{}".format(match_gsv_data[3])) - if (int(match_gsv_data[3]) < 3 and self.wifi_data != [] and self.cell_data != [] and self.location_timer_count > 10): #超过10秒且卫星个数少于3 - #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): -# print("phonebook %s"%(msg)) -# return { -# "张三": "15692025051", -# "李四": "15692025051", -# "崔崔": "15692025051", -# "鱼鱼": "15692025051", -# "坤坤": "15692025051", -# } -# def set(self, event, msg): -# print("phonebook %s"%(msg)) -class AddrBookManager(Abstract): - # 通讯录 - def __init__(self): - self.read_phonebook = {} - self.check_json = 0 - self.check_json = ql_fs.path_exists("/ext/static/storage_file/phonebook.json") - - if self.check_json == True: - with open("/ext/static/storage_file/phonebook.json","r",encoding="utf-8") as fd: - self.read_phonebook = ujson.load(fd) - print("读取电话本") - - def post_processor_after_instantiation(self): - EventMesh.subscribe("get_phonebook_list", self.get) - EventMesh.subscribe("set_phonebook_list", self.set) - - def get(self, event, msg): - self.check_json = ql_fs.path_exists("/ext/static/storage_file/phonebook.json") - return [self.check_json,self.read_phonebook] - - def set(self, event, msg): - self.check_json = msg[0] - self.read_phonebook = msg[1] - -import sms -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() - print("self.msg_nums {}:".format(self.msg_nums)) - return self.msg_nums - - def get_msg_detail(self, event, msg): - - # self.msg_detail = sms.searchTextMsg(self.msg_nums) - # print("self.msg_detai {}:".format(self.msg_detai)) - 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.read_call_log = {} - self.check_json = ql_fs.path_exists("/ext/static/storage_file/Call_log.json") - - if self.check_json == True: - with open("/ext/static/storage_file/Call_log.json","r",encoding="utf-8") as fd: - self.read_call_log = ujson.load(fd) - print("读取通话记录") - - def post_processor_after_instantiation(self): - EventMesh.subscribe("get_call_log_list", self.get) - EventMesh.subscribe("set_call_log_list", self.set) - - def get(self, event, msg): - self.check_json = ql_fs.path_exists("/ext/static/storage_file/Call_log.json") - return [self.check_json,self.read_call_log] - - def set(self, event, msg): - self.check_json = msg[0] - self.read_call_log = msg[1] - - # def call_usr(self,event,msg): - # content = self.log[msg] - # # 参数1 姓名 参数2 电话 参数3 1/主动呼叫 0别人呼叫 - # EventMesh.publish("call_in", [content[2], content[0], 1]) - - - -class PhoneCallingManager(Abstract): - def __init__(self): - 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): - return self.phonename - - 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 - -#获取心率 血氧 步数历史数据 -class gethistoryDataManager(Abstract): - def __init__(self): - self.oldHr = 0 - self.oldspo2 = 0 - self.oldstep = 0 - self.old_step = 0 - self.read_data = {} - check_json= ql_fs.path_exists("/ext/static/storage_file/config.json") - if check_json == True : - with open("/ext/static/storage_file/config.json","r") as fd:#音频文件编号 - self.read_data = ujson.load(fd) - if self.read_data != {}: - b = str("old_hr") in self.read_data.keys() - if b == True: - self.oldHr = self.read_data["old_hr"] - else: - self.oldHr = 0 - old_spo2 = str("old_spo2") in self.read_data.keys() - if old_spo2 == True: - self.oldspo2 = self.read_data["old_spo2"] - else: - self.oldspo2 = 0 - old_step = str("old_step") in self.read_data.keys() - if old_step == True: - self.oldstep = self.read_data["old_step"] - else: - self.oldstep = 0 - else: - self.oldHr = 0 - self.oldspo2 = 0 - self.oldstep = 0 - - def post_processor_after_instantiation(self): - EventMesh.subscribe("set_old_hr_data", self.save_hr_value) - EventMesh.subscribe("get_old_hr_data", self.get_hr_value) - EventMesh.subscribe("set_old_spo2_data", self.save_spo2_value) - EventMesh.subscribe("get_old_spo2_data", self.get_spo2_value) - - EventMesh.subscribe("get_old_step_value", self.get_old_step_value) - EventMesh.subscribe("set_old_step_value", self.set_old_step_value) - - def save_hr_value(self, event, msg): - if msg >= 50: - self.read_data = EventMesh.publish("get_storage_data") - self.read_data["old_hr"] = msg - - EventMesh.publish("set_storage_data", self.read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - self.oldHr = msg - - def get_hr_value(self, event, msg): - return self.oldHr - - def save_spo2_value(self, event, msg): - if msg >= 85: - self.read_data = EventMesh.publish("get_storage_data") - self.read_data["old_spo2"] = msg - - EventMesh.publish("set_storage_data", self.read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - self.oldspo2 = msg - - def get_spo2_value(self, event, msg): - return self.oldspo2 - - def set_old_step_value(self, event, msg): - self.oldstep = msg - - - def get_old_step_value(self, event, msg): - step = EventMesh.publish(constants.EVENT.GET_STEP) - self.old_step = self.oldstep + step[0] - return self.old_step - - - - -class getWeatherDataManager(Abstract): - # 获取天气数据 - def __init__(self): - self.date = {} #日期23-04-07 - self.time = {} #14:41:41 - self.content = {} #天气描述 - self.type = None #天气类型 - self.temp = None #当前温度 - self.min_temp = None #最低温度 - self.max_temp = None #最高温度 - self.city = {} #城市 - self.no_data = 0#0沒有数据 1有数据 - - def post_processor_after_instantiation(self): - EventMesh.subscribe("get_weather_data", self.get) - EventMesh.subscribe("set_weather_data", self.set) - - def get(self, event, msg): - return [self.date,self.time,self.content,self.type,self.temp,self.min_temp,self.max_temp,self.city,self.no_data] - - def set(self, event, msg): - self.date = msg[0] - self.time = msg[1] - self.content = msg[2] - self.type = msg[3] - self.temp = msg[4] - self.min_temp = msg[5] - self.max_temp = msg[6] - self.city = msg[7] - self.no_data = msg[8] - - -class getHrTimeManager(Abstract): - def __init__(self): - self.set_time = 0 - self.set_hr = 0 #0关闭 1手动 2 自动测量按照时间间隔测试心率 - self.set_spo2 = 0 - check = ql_fs.path_exists("/ext/static/storage_file/config.json") - if check == True: - with open("/ext/static/storage_file/config.json","r") as fd: - self.read_data = ujson.load(fd) - if self.read_data != {}: - b = str("measure_time") in self.read_data.keys() - if b == True: - self.set_time = self.read_data["measure_time"] - - def post_processor_after_instantiation(self): - EventMesh.subscribe("set_time_hr_spo2", self.set_time_hr_spo2) - EventMesh.subscribe("get_time_hr_spo2", self.get_time_hr_spo2) - EventMesh.subscribe("set_hr_state", self.set_hr_state) - EventMesh.subscribe("get_hr_state", self.get_hr_state) - EventMesh.subscribe("set_spo2_state", self.set_spo2_state) - EventMesh.subscribe("get_spo2_state", self.get_spo2_state) - - - def set_time_hr_spo2(self, event, msg): - self.set_time = msg - - def get_time_hr_spo2(self, event, msg): - - return self.set_time - - def set_hr_state(self, event, msg): - self.set_hr = msg - - def get_hr_state(self, event, msg): - return self.set_hr - - def set_spo2_state(self, event, msg): - self.set_spo2 = msg - - def get_spo2_state(self, event, msg): - return self.set_spo2 - - -class getBrightnessManager(Abstract):#获取亮度级别 - def __init__(self): - self.level = 6#默认值6 - self.read_data = {} - self.time = 5 - self.PWM_backlight = None - check = ql_fs.path_exists("/ext/static/storage_file/config.json") - if check == True: - with open("/ext/static/storage_file/config.json","r") as fd: - self.read_data = ujson.load(fd) - - def post_processor_after_instantiation(self): - EventMesh.subscribe("get_brightness_level", self.get_brightness_level) - EventMesh.subscribe("push_add_brightness_level", self.add) - EventMesh.subscribe("push_reduce_brightness_level", self.reduce) - EventMesh.subscribe("set_brightness_level", self.set_brightness_level) - - EventMesh.subscribe("set_brightness_time", self.set_brightness_time) - EventMesh.subscribe("get_brightness_time", self.get_brightness_time) - - def set_brightness_level(self, event, msg): - self.level = msg - - def get_brightness_level(self, event, msg): - if self.read_data != {}: - b = str("brightness_level") in self.read_data.keys() - if b == True: - self.level = self.read_data["brightness_level"] - return self.level - - def set_brightness_time(self, event, msg): - self.time = msg - - def get_brightness_time(self, event, msg): - # print("get_brightness_time self.read_data:{} self.time:{}".format(self.read_data,self.time)) - if self.read_data != {}: - b = str("brightness_time") in self.read_data.keys() - if b == True: - self.time = self.read_data["brightness_time"] - return self.time - - - - def add(self, event, msg): - if self.level < 10: - self.level = self.level + 2 - self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10) - self.PWM_backlight.open() - - self.read_data = EventMesh.publish("get_storage_data") - self.read_data["brightness_level"] = self.level - - EventMesh.publish("set_storage_data", self.read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - - def reduce(self, event, msg): - if self.level > 0: - self.level = self.level - 2 - if self.level <= 0: - self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 10) - else: - self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS,self.level, 10) - - self.PWM_backlight.open() - self.read_data = EventMesh.publish("get_storage_data") - self.read_data["brightness_level"] = self.level - EventMesh.publish("set_storage_data", self.read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - -class getStorageDataManager(Abstract):#获取内存数据 - def __init__(self): - self.read_data = {} - check = ql_fs.path_exists("/ext/static/storage_file/config.json") - if check == True: - with open("/ext/static/storage_file/config.json","r") as fd: - self.read_data = ujson.load(fd) - - def post_processor_after_instantiation(self): - EventMesh.subscribe("set_storage_data", self.set_storage_data) - EventMesh.subscribe("get_storage_data", self.get_storage_data) - - def set_storage_data(self, event, msg): - if msg != None: - self.read_data = msg - - def get_storage_data(self, event, msg): - return self.read_data - -#定位频率 -class getUpLoadDataManager(Abstract):# - def __init__(self): - self.upload_time = 1800 - check = ql_fs.path_exists("/ext/static/storage_file/config.json") - if check == True: - with open("/ext/static/storage_file/config.json","r") as fd: - self.read_data = ujson.load(fd) - if self.read_data != {}: - b = str("upload_time") in self.read_data.keys() - if b == True: - self.upload_time = self.read_data["upload_time"] - - def post_processor_after_instantiation(self): - EventMesh.subscribe("set_upload_data", self.set_upload_data) - EventMesh.subscribe("get_upload_data", self.get_upload_data) - - def set_upload_data(self, event, msg): - self.upload_time = msg - - def get_upload_data(self, event, msg): - return self.upload_time - -class getVolumSizeManager(Abstract):#设置或获取音量大小数据 - def __init__(self): - self.volume_size = 8 - self.read_data = {} - check = ql_fs.path_exists("/ext/static/storage_file/config.json") - - if check == True: - with open("/ext/static/storage_file/config.json","r") as fd: - self.read_data = ujson.load(fd) - if self.read_data != {}: - b = str("volum") in self.read_data.keys() - if b == True: - self.volume_size = self.read_data["volum"] - else: - self.volume_size = 8 - else: - self.volume_size = 8 - # print("self.volume_size:{}".format(self.volume_size)) - def post_processor_after_instantiation(self): - EventMesh.subscribe("set_volum_size", self.set_volum_size) - EventMesh.subscribe("get_volum_size", self.get_volum_size) - - def set_volum_size(self, event, msg): - self.volume_size = msg - - def get_volum_size(self, event, msg): - return self.volume_size - -class getSosFlagManager(Abstract):#设置或获取音量大小数据 - def __init__(self): - self.sos_flag = 0 - self.sos_num = 0 - self.call_timer = osTimer() - self.sos_numer1 = [] - self.callnumer ="" - self.read_data = {} - check = ql_fs.path_exists("/ext/static/storage_file/config.json") - - if check == True: - with open("/ext/static/storage_file/config.json","r") as fd: - self.read_data = ujson.load(fd) - if self.read_data != {}: - b1 = str("SOS_NUMBER1") in self.read_data.keys() - if b1 == True: - self.sos_numer1 = [self.read_data["SOS_NUMBER1"]] - b2 = str("SOS_NUMBER2") in self.read_data.keys() - if b2 == True: - self.sos_numer1 = [self.read_data["SOS_NUMBER1"], self.read_data["SOS_NUMBER2"]] - - b3 = str("SOS_NUMBER3") in self.read_data.keys() - if b3 == True: - self.sos_numer1 = [self.read_data["SOS_NUMBER1"], self.read_data["SOS_NUMBER2"],self.read_data["SOS_NUMBER3"]] - - # print("self.sos_numer1:{} self.read_data:{}".format(self.sos_numer1,self.read_data)) - - def post_processor_after_instantiation(self): - EventMesh.subscribe("set_sos_flag", self.set_sos_flag)#设置sos拨打标识 - EventMesh.subscribe("get_sos_flag", self.get_sos_flag) - - EventMesh.subscribe("set_sos_num", self.set_sos_num)#设置拨打循环次数 - EventMesh.subscribe("get_sos_num", self.get_sos_num) - - EventMesh.subscribe("set_dial_sos_number", self.set_dial_sos_number) - - EventMesh.subscribe("set_callnumer_cb", self.set_callnumer_cb)#延时回调 - - EventMesh.subscribe("get_dial_sos_number", self.get_dial_sos_number)#设置家庭号码三个 - - def set_sos_flag(self, event, msg): - self.sos_flag = msg - if self.sos_flag == 1: - number = EventMesh.publish("get_dial_sos_number") - if len(number) > 0 and number != None: - EventMesh.publish("save_phonename",number[0]) - EventMesh.publish("save_phonenum",number[0]) - voiceCall.callStart(str(number[0])) - - - def set_callnumer_cb(self, event, msg): - self.callnumer = msg - self.call_timer.start(5000, 0, self.call_timer_cb)#延迟1S 继续拨打 - - def call_timer_cb(self, *args, **kwargs): - # print("call_timer_cb:{}".format(self.callnumer)) - EventMesh.publish("save_phonename",str(self.callnumer)) - EventMesh.publish("save_phonenum",str(self.callnumer)) - voiceCall.callStart(str(self.callnumer)) - - def get_sos_flag(self, event, msg): - return self.sos_flag - - def set_sos_num(self, event, msg): - self.sos_num = msg - - def get_sos_num(self, event, msg): - return self.sos_num - - def set_dial_sos_number(self, event, msg): - self.sos_numer1 = msg - # print("self.sos_numer1:{}".format(self.sos_numer1)) - - def get_dial_sos_number(self, event, msg): - return self.sos_numer1 - - -class getBootOffManager(Abstract):#开关机时间 - def __init__(self): - self.read_data = {} - self.off_msg = [] - check = ql_fs.path_exists("/ext/static/storage_file/config.json") - - if check == True: - with open("/ext/static/storage_file/config.json","r") as fd: - self.read_data = ujson.load(fd) - if self.read_data != {}: - b1 = str("off_on") in self.read_data.keys() - if b1 == True: - self.off_on = self.read_data["off_on"] - b2 = str("off_start") in self.read_data.keys() - if b2 == True: - self.off_start= self.read_data["off_start"] - - b3 = str("off_end") in self.read_data.keys() - if b3 == True: - self.off_end = self.read_data["off_end"] - - # print("self.sos_numer1:{} self.read_data:{}".format(self.sos_numer1,self.read_data)) - - def post_processor_after_instantiation(self): - EventMesh.subscribe("set_boot_off_time", self.set_boot_off_time)#设置关机时间 - EventMesh.subscribe("get_boot_off_time", self.get_boot_off_time) - - # def _rtc_callback(self,args): - # print("---!!!!!!alarm_ring!!!!!!!---,idx:",args) - - # def set_boot_off_time(self, event, msg): - - # self.off_msg = msg - # if msg[0] == 0: - # return - - # rtc_now_time = self.rtc.datetime() - - # # data = RTC().datetime() - # # hour = data[4] - # # min = data[5] - - - - # current_minute = rtc_now_time[4]*60 + rtc_now_time[5] #当前的分钟数不包含年月日 - # off_msg1 = msg[1] - # off_msg2 = msg[2] - # msg_tmp1 = off_msg1.split(':') - # msg_tmp2 = off_msg2.split(':') - # start_min = msg_tmp1[0]*60+msg_tmp1[1] - # end_min = msg_tmp2[0]*60+msg_tmp2[1] - # #9:00 6:00 - # if current_minute > start_min:#如果当前的分钟数 大于开始的关机时间分钟数 则认为是第二天6:00需要开机 23:00需要关机 - # next_alarm_time = utime.localtime(next_alarm_mktime) - # pass - - - # print("04当前的rtc_total_minutes:{}".format(current_minute)) - - # if current_minute in minute_list: - # print("当前时间和闹钟列表时间重复,删除重复的时间") - # minute_list.remove(current_minute) - - # minute_list.append(current_minute) - - # # 对分钟数列表进行排序,并获取当前时间分钟数所在的位置 - # minute_list = sorted(minute_list) - # current_index = minute_list.index(current_minute) - - # print("05将当前时间插入min_list后的min_list:{}".format(minute_list)) - # print("06当前时间所在位置:{}".format(current_index)) - - # next_index = current_index + 1 - # if next_index >= len(minute_list): - # next_minute = minute_list[0] - # print("07下一个闹钟的分钟数:", next_minute) - # else: - # next_minute = minute_list[next_index] - # print("07下一个闹钟的分钟数:", next_minute) - - # if next_minute >= current_minute: - # interval_minute = next_minute - current_minute - # print("08距离下一次响铃的的分钟数:", interval_minute) - # else: - # interval_minute = end_minute - current_minute + next_minute - # print("08距离下一次响铃的的分钟数:", interval_minute) - - # #反向获取时间戳 - # time = utime.localtime() - # print("09获取utime的时间戳:", time) - # rtc_mktime = utime.mktime(time) - # print("10反向获取utime的mktime:", rtc_mktime) - - # #加上下一次响铃需要的时间 - # next_alarm_mktime = rtc_mktime + interval_minute*60 - # print("11下一次响铃的mktime:", next_alarm_mktime) - - # #格式化时间戳,得到下一次闹钟的时间 - # next_alarm_time = utime.localtime(next_alarm_mktime) - # print("12下一次响铃的准确时间:", next_alarm_time) - # #将时间转换为rtc的格式 - # data_l = [2021, 7, 9, 5, 12, 30, 0, 0] - # #给rtc时间赋值 - # data_l[0] = next_alarm_time[0] #year - # data_l[1] = next_alarm_time[1] #month - # data_l[2] = next_alarm_time[2] #day - # data_l[4] = next_alarm_time[3] #hour - # data_l[5] = next_alarm_time[4] #minute - # #转换为元组 - # data_e=tuple(data_l) - # print("13将该时间转换为RTC元组:", data_e) - - # #设置rtc闹钟时间 - # self.rtc.register_callback(self._rtc_callback) - - # FLAG = self.rtc.set_alarm(data_e) - # if FLAG == 0: - # print("成功设置rtc的到期时间:", data_e) - # else: - # print("设置rtc的到期时间失败:", data_e) - - # self.rtc.enable_alarm(1) - - # def get_boot_off_time(self, event, msg): - # return self.off_msg - - \ No newline at end of file diff --git a/3.code/1.watch/2.code/protocol.py b/3.code/1.watch/2.code/protocol.py deleted file mode 100644 index f4106e22..00000000 --- a/3.code/1.watch/2.code/protocol.py +++ /dev/null @@ -1,952 +0,0 @@ -import ujson -import utime -import EventMesh -import constants -from common import Abstract -import uhashlib -import ubinascii -from misc import Power -import audio -from machine import Pin -import ujson -import ql_fs -def unicode_to_utf8(src): - ref = 0xe08080 - result = ref - - #取最后六位 - a = src & 0x3f - - #将最后六位放在ref最后六位的空位置 - result = result | a - src = src >> 6 - - #取接下来的六位 - a = src & 0x3f - - #放在ref对应的六个位置 - result = result | (a << 8) - - #保留最后四位 - src = src >> 6 - - #放在ref对应的四个位置 - result = result | (src << 16) - return result - -def UnicodeHexStr_To_Utf8Str(str): - odata = 0 - - result = bytes() - su =str.upper() - - i = 0 - for c in su: - tmp=ord(c) - if tmp <= ord('9') : - odata = odata << 4 - odata += tmp - ord('0') - - elif ord('A') <= tmp <= ord('F'): - odata = odata << 4 - odata += tmp - ord('A') + 10 - if(i%4==3): #每2字节获取一个int,拿到转换后的unicode int - #print(odata.to_bytes(2, 'big')) - #result.append(odata) - if odata > 255: - tmp = unicode_to_utf8(odata)#拿到转换后的utf8 int - tmp2 = tmp.to_bytes(3, 'big') #转bytes - else : - tmp2 = odata.to_bytes(1, 'big') - #print("tmp2:{}".format(tmp2)) - result = result + tmp2 - odata = 0 - i+=1 - return result.decode('utf-8') #返回utf8的str - -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)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166" #EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#"867387060319188"#"867387060319177"#"867387060319166"#"860132060004322"#"867387060319166"#"860132060004322"#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) - EventMesh.publish(constants.EVENT.START_LOCATION) #开始定位 - -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.decode('ascii') - data_tmp = data_tmp.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) - #步数 - old_step = 0 - step = 0 - step = EventMesh.publish("get_old_step_value") - if step != 0: - read_data = EventMesh.publish("get_storage_data") - b = str("old_step_new") in read_data.keys() - if b == True: - old_step = read_data["old_step_new"] - else: - old_step = 0 - if old_step != step: - # print("old_step:send:%d %d"%(old_step,step)) - read_data["old_step"] = step - read_data["old_step_new"] = step+10 - EventMesh.publish("set_storage_data", read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(read_data,fd) - - old_step = step - # 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]) - #步数 - old_step = 0 - step = 0 - step = EventMesh.publish("get_old_step_value") - if step != 0: - read_data = EventMesh.publish("get_storage_data") - b = str("old_step_new") in read_data.keys() - if b == True: - old_step = read_data["old_step_new"] - else: - old_step = 0 - if old_step != step: - read_data["old_step"] = step - read_data["old_step_new"] = step - EventMesh.publish("set_storage_data", read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(read_data,fd) - old_step = step - # 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) - wt_data = "%s"%(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) - - - - #这个是发送WT位置数据到手机端 - msg_tmp = wt_data.split('UD,') - msg_tmp = msg_tmp[1] - # print("WT_ProtoCol:msg_tmp:%s"%(msg_tmp)) - send_data_1 = "SZKW*%s*%04x*WT"%(self.imei,len(msg_tmp)) - MD5_SIGN_1 = self.pack_MD5_head(send_data_1) - data_1 = "[%s%s,%s]"%(str(MD5_SIGN_1),send_data_1,msg_tmp) - # print("WT_ProtoCol:send:%s"%(data_1)) - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data_1) - # 通过socket发送到服务器端 - - - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: PING - @param msg: 接收到的下行数据 - """ - # print("UD_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, 1, '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)) - EventMesh.publish("load_screen", {"screen": "poweroff_comfirm"}) - -class PHL_ProtoCol(ProtoCol): - """电话本同步""" - TYPE = "PHL" - - - def send(self, event, msg): - # [SZKW*867387060319491*0008*PHL] - send_data = "SZKW*%s*0003*PHL"%(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: 电话本同步 - @param msg: 接收到的下行数据 - """ - msg = msg[1:-1] - # print("phonebook:msg:%s\r\n"%msg) - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - # print("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp)) - - phonebook = {} - msg_tmp = msg_tmp[1:] - # print("msg_tmp1:{}".format(msg_tmp)) - j = 0 - i = 0 - phonebook_oldtmp = {} - # 0 1 2 3 - for phonebook_tmp in msg_tmp: - j+=1 - # print("phonebook_tmp:{}".format(phonebook_tmp)) - - if (j%2) == 0: - i+=1 - phonebook_name = UnicodeHexStr_To_Utf8Str(phonebook_tmp) - phonebook_name = "{}:{}".format("%03d"%i,phonebook_name) - phonebook[phonebook_name] = phonebook_oldtmp - - phonebook_oldtmp = phonebook_tmp - # print("phonebook_oldtmp!!!:{}".format(str(phonebook_oldtmp))) - # print("phonebook!!!:{}".format(str(phonebook))) - with open("/ext/static/storage_file/phonebook.json","w",encoding="utf-8") as fd: - ujson.dump(phonebook,fd) - print("创建电话簿") - - EventMesh.publish(constants.PROTOCOL.PHL_SEND) - EventMesh.publish("set_phonebook_list",[1,phonebook]) - EventMesh.publish("contact_updata_list_show") - - -class WT_ProtoCol(ProtoCol): - """天气数据""" - TYPE = "WT" - - - def send(self, event, msg): - # [SZKW*867387060319491*0008*WT] - send_data = "SZKW*%s*003*WT"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # print("WT_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - - @param event: T天气温度数据下发 - @param msg: 接收到的下行数据 - """ - # b'SZKW*860132060004322*0035*WT,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02' - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split('WT,') - # print("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp)) - msg_tmp = msg_tmp[1] - - # print("msg_tmp :%s"%(msg_tmp)) - - msg_date = msg_tmp.split(',')[0] - - msg_time = msg_tmp.split(',')[1] - msg_weather_content = msg_tmp.split(',')[2] - msg_type = msg_tmp.split(',')[3] - msg_temp = msg_tmp.split(',')[4] - msg_min_temp = msg_tmp.split(',')[5] - msg_max_temp = msg_tmp.split(',')[6] - msg_city = msg_tmp.split(',')[7] - - msg_city = UnicodeHexStr_To_Utf8Str(msg_city) - msg_weather_content = UnicodeHexStr_To_Utf8Str(msg_weather_content) - # print("msg_date:{} msg_time:{} msg_weather_content:{} msg_type:{} msg_temp:{} msg_min_temp:{} msg_max_temp:{} msg_city:{}".format(msg_date,msg_time,\ - # msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city)) - print("WT_ProtoCol RECV msg:%s"%(msg)) - - EventMesh.publish("set_weather_data",[msg_date,msg_time,msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city,1]) - EventMesh.publish("updata_weather_show") - EventMesh.publish(constants.PROTOCOL.WT_SEND) - -class REMIND_ProtoCol(ProtoCol): - """闹钟数据""" - TYPE = "REMIND" - - - def send(self, event, msg): - # [SZKW*867387060319491*0008*REMIND] - send_data = "SZKW*%s*006*REMIND"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # print("REMIND_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data) - - def recv(self, event, msg): - """ - @param event: 闹钟数据下发 - @param msg: 接收到的下行数据 - """ - # b'SZKW*860132060004322*0035*REMIND,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02' - # print("REMIND_ProtoCol RECV msg:%s"%(msg)) - self.alarm_list = [] - - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split('REMIND,') - msg_tmp = msg_tmp[1] - num = 0 - j=0 - for j in range(0,3): - self.alarm_day = [] - self.alarm_week = [] - self.alarm_total_data = [] - self.alarm_total_data = msg_tmp.split(',')[j] - - b = self.alarm_total_data.find('-') - if b != -1: - alarm_data = self.alarm_total_data.split('-')#-作为分隔符 - alarm_switch = int(alarm_data[1])#开关 - alarm_day_num = int(alarm_data[2])#天 - alarm_time = alarm_data[0]#时间 - alarm_time_tmp = alarm_time.split(':')#冒号分隔时间 时 分 - alarm_time_hour = int(alarm_time_tmp[0]) - alarm_time_min = int(alarm_time_tmp[1]) - if alarm_day_num == 3: - self.alarm_week = alarm_data[3]#星期 - - if alarm_day_num == 2:#每一天 - self.alarm_day = [1,2,3,4,5,6,0] - elif alarm_day_num == 3:#自定义 - for i in range(0,7): - if self.alarm_week[i] != '0': - self.alarm_day.append(i) - self.alarm_list.append({"idx": num, "hour": alarm_time_hour, "minute": alarm_time_min, "days": self.alarm_day, "enabled": alarm_switch,"repeart":alarm_day_num}) - with open("/ext/static/storage_file/alarm_msg.json", 'w',encoding='utf-8') as fd: - ujson.dump(self.alarm_list,fd) - num+=1 - if num >= 2: - num = 2 - EventMesh.publish("push_update_alarm_show") - EventMesh.publish(constants.PROTOCOL.REMIND_SEND) - -class HRSTART_ProtoCol(ProtoCol): - """心率频率数据""" - TYPE = "hrtstart" - - - def send(self, event, msg): - # [SZKW*867387060319491*0008*hrtstart] - send_data = "SZKW*%s*008*hrtstart"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # print("HRSTART_ProtoCol:send:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 心率数据下发 - @param msg: 接收到的下行数据 - """ - # b'SZKW*860132060004322*0035*REMIND,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02' - # print("REMIND_ProtoCol RECV msg:%s"%(msg)) - # HRSTART_ProtoCol RECV msg:b'SZKW*860132060004322*000D*hrtstart,7200' msg_:7200 - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - # print("HRSTART_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp)) - hrTotal = int(msg_tmp) - if hrTotal == 1:#单次测量 - get_hr_state = EventMesh.publish("get_hr_state") - get_spo2_state = EventMesh.publish("get_spo2_state") - if (get_spo2_state == 3) or (get_spo2_state == 0 and get_hr_state == 0):#只要两个不在测量 单次优先级最低 - EventMesh.publish("set_hr_state",3)#3代表单次测量 - elif hrTotal > 1: - if hrTotal <= 300: - hrTotal = 300 - storage_tmp = EventMesh.publish("get_storage_data") - storage_tmp["measure_time"] = hrTotal - EventMesh.publish("set_storage_data", storage_tmp) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(storage_tmp,fd) - - EventMesh.publish("set_time_hr_spo2",hrTotal) - - EventMesh.publish(constants.PROTOCOL.HRTSTART_SEND) - -class HEART_ProtoCol(ProtoCol): - """心率数据""" - TYPE = "heart" - - - def send(self, event, msg): - # [SZKW*334588000000156*len*heart,x] - # print("HEART:send:{}".format(msg)) - len_size = len(str(msg))+6 - send_data = "SZKW*%s*%04X*heart"%(self.imei,len_size) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) - # print("HEART_ProtoCol:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 心率数据下发 - @param msg: 接收到的下行数据 - """ - # print("HRSTART_ProtoCol RECV msg:") - #EventMesh.publish(constants.PROTOCOL.HEART_SEND) -class OXYGEN_ProtoCol(ProtoCol): - """上传血氧测试数据""" - TYPE = "oxygen" - def send(self, event, msg): - # [SZKW*334588000000156*len*heart,x] - # print("oxstart:send:{}".format(msg)) - len_size = len(str(msg))+6 - send_data = "SZKW*%s*%04X*oxygen"%(self.imei,len_size) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) - # print("HEART_ProtoCol:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 心率数据下发 - @param msg: 接收到的下行数据 - """ - # print("HRSTART_ProtoCol RECV msg:") - #EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND) - -class OXYGEN_One_ProtoCol(ProtoCol):#单次测量 - """上传单次测量测试数据""" - TYPE = "oxstart" - -# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*oxygen,x] -# x 表示血氧饱和度 -# 示例[XT*334588000000156*0009*oxygen,15] -# 平台回复:handler -> b'[SZKW*860132060004322*0009*oxstart,1]' -# [XT*334588000000156*0006*oxygen] - def send(self, event, msg): - # [SZKW*334588000000156*len*heart,x] - print("oxstart:") - send_data = "SZKW*%s*0007*oxstart"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - # print("HEART_ProtoCol:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 血氧单次测量下发 - @param msg: 接收到的下行数据 - """ - print("oxstart:{}".format(msg)) - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - state = int(msg_tmp) - get_hr_state = EventMesh.publish("get_hr_state") - get_spo2_state = EventMesh.publish("get_spo2_state") - if state == 1: - if (get_hr_state == 3 ) or (get_spo2_state == 0 and get_hr_state == 0):#只要两个不在测量 单次优先级最低 - EventMesh.publish("set_spo2_state",3)#3代表单次测量 - EventMesh.publish(constants.PROTOCOL.OXSTART_SEND) - -class TEMP_ProtoCol(ProtoCol): - """上传体温测试数据""" - TYPE = "temp" - def send(self, event, msg): - # [SZKW*334588000000156*len*heart,x] - # print("temp:send:{}".format(msg)) - len_size = len(str(msg))+5 - # 实例:[XT*334588000000156*0009*temp,36.2] - # 代表终端的温度为:36.2 - # 平台回复: - # [XT*334588000000156*0004*temp] - send_data = "SZKW*%s*%04X*temp"%(self.imei,len_size) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s,%d.%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1]) - # print("temp:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: 心率数据下发 - @param msg: 接收到的下行数据 - """ - # print("HRSTART_ProtoCol RECV msg:") - #EventMesh.publish(constants.PROTOCOL.TEMP_SEND) - -#解绑 -# [XT*334588000000156*0003*DLT] -def reset_factory(msg): - if msg == 1: - Power.powerRestart() -class DLT_ProtoCol(ProtoCol): - """解绑数据""" - TYPE = "DLT" - def send(self, event, msg): - # [XT*334588000000156*0004*temp] - send_data = "SZKW*%s*0003*DLT"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - print("temp:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # print("DLT_ProtoCol RECV msg:") - reset_factory(1) - -#定位频率 -class UPLOAD_ProtoCol(ProtoCol): - """定位频率数据""" - TYPE = "UPLOAD" - def send(self, event, msg): - # [XT*334588000000156*0004*temp] - send_data = "SZKW*%s*0006*UPLOAD"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*UPLOAD,600]' - # print("DLT_ProtoCol RECV msg:".format(msg)) - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - upload_time = int(msg_tmp) - storage_tmp = EventMesh.publish("get_storage_data") - storage_tmp["upload_time"] = upload_time - EventMesh.publish("set_storage_data", storage_tmp) - EventMesh.publish("set_upload_data", upload_time) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(storage_tmp,fd) - EventMesh.publish(constants.PROTOCOL.UPLOAD_SEND) - -#设置快捷号码 -class CENTER_ProtoCol(ProtoCol): - """设置快捷号码""" - TYPE = "CENTER" - def send(self, event, msg): - # [XT*334588000000156*0004*temp] - send_data = "SZKW*%s*0006*CENTER"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - print("UPLOAD:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*UPLOAD,600]' - # print("DLT_ProtoCol RECV msg:".format(msg)) - msg = msg[1:-1] - msg_tmp = msg.decode('ascii') - msg_tmp = msg_tmp.split(',') - msg_tmp = msg_tmp[1] - print("CENTER_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp)) - center_dial = str(msg_tmp) - storage_tmp = EventMesh.publish("get_storage_data") - storage_tmp["center_dial"] = center_dial - EventMesh.publish("set_storage_data", storage_tmp) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(storage_tmp,fd) - EventMesh.publish(constants.PROTOCOL.CENTER_SEND) - -#呼叫快捷电话号码 -import voiceCall -class MONITOR_ProtoCol(ProtoCol): - """呼叫快捷号码""" - TYPE = "MONITOR" - def send(self, event, msg): - # [XT*334588000000156*0004*MONITOR] - send_data = "SZKW*%s*0007*MONITOR"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - print("MONITOR:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*MONITOR]' - self.read_data = {} - self.read_data = EventMesh.publish("get_storage_data") - if self.read_data != {}: - b = str("center_dial") in self.read_data.keys() - if b == True: - contact = self.read_data["center_dial"] - if len(contact) > 0: - print("MONITOR RECV msg:{} {}".format(contact,type(contact))) - EventMesh.publish("save_phonename", contact) - EventMesh.publish("save_phonenum", contact) - voiceCall.callStart(contact) - EventMesh.publish(constants.PROTOCOL.MONITOR_SEND) - -#SOS紧急电话 -class SOS_ProtoCol(ProtoCol): - """紧急呼叫""" - TYPE = "SOS" - def send(self, event, msg): - # [XT*334588000000156*0004*MONITOR] - send_data = "SZKW*%s*0003*SOS"%(self.imei) - MD5_SIGN = self.pack_MD5_head(send_data) - data = "[%s%s]"%(str(MD5_SIGN),send_data) - print("SOS:data:%s"%(data)) - # 通过socket发送到服务器端 - EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - - def recv(self, event, msg): - """ - @param event: - @param msg: 接收到的下行数据 - """ - # b'[SZKW*867387060319166*000A*SOS_SEND]' - self.read_data = {} - self.read_data = EventMesh.publish("get_storage_data") - if self.read_data != {}: - b = str("center_dial") in self.read_data.keys() - if b == True: - sos_dial = self.read_data["center_dial"] - if len(sos_dial) > 0: - pass - # print("SOS RECV msg:{} {}".format(sos_dial,type(sos_dial))) - # EventMesh.publish("save_phonename", sos_dial) - # voiceCall.callStart(sos_dial) - EventMesh.publish(constants.PROTOCOL.SOS_SEND) - - -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) - print("handler:{}".format(type(data))) - data_tmp = data.decode('ascii') - data_tmp = data_tmp.split(']')[0] #去掉] - ProtoCol_type = data_tmp.split('*')[3] #拿到协议标识 - ProtoCol_type = ProtoCol_type.split(',')[0] - ProtoCol_type = "%s_RECV"%(ProtoCol_type) - # print("ProtoColResolver:ProtoCol_type:%s\r\ndata:%s"%(ProtoCol_type,data)) - EventMesh.publish(ProtoCol_type, data) #返回协议read diff --git a/3.code/1.watch/2.code/static/alarm_play.mp3 b/3.code/1.watch/2.code/static/alarm_play.mp3 deleted file mode 100644 index 59ede9f1..00000000 Binary files a/3.code/1.watch/2.code/static/alarm_play.mp3 and /dev/null 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 deleted file mode 100644 index 97d5db5b..00000000 Binary files a/3.code/1.watch/2.code/static/audio_audio_haixiu.mp3 and /dev/null differ diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/bg.png b/3.code/1.watch/2.code/static/watch_plate/style_1/bg.png deleted file mode 100644 index cedcfba7..00000000 Binary files a/3.code/1.watch/2.code/static/watch_plate/style_1/bg.png and /dev/null differ diff --git a/3.code/1.watch/2.code/test_sms.py b/3.code/1.watch/2.code/test_sms.py deleted file mode 100644 index 0955ecc7..00000000 --- a/3.code/1.watch/2.code/test_sms.py +++ /dev/null @@ -1,285 +0,0 @@ - - - -import lvgl as lv -import EventMesh -import sms -from ui import style_screen,style_font_youyuan_20_black,style_font_youyuan_20,Screen,style_contact_btn,style_img,style_line -from common import Abstract -import voiceCall -import ql_fs -import ujson -from protocol import ProtoCol,UnicodeHexStr_To_Utf8Str -import constants -import osTimer -import utime -from machine import RTC -from misc import PWM - -#心率定时测量 -# class hrTimeHandlerManager(Abstract): -# def __init__(self): -# super().__init__() -# self.rtc = RTC() -# self.timer = osTimer() -# self.second = 0 - -# def post_processor_after_instantiation(self): - -# date_tmp = utime.localtime() -# time_tmp = utime.mktime(date_tmp) -# self.second = time_tmp -# # self.timer.start(1*1000,1,self._min_callback) - - -# def _min_callback(self,args): -# self.second+=1 -# date_tmp = utime.localtime() -# time_tmp = utime.mktime(date_tmp) -# rtc_now_time = self.rtc.datetime() -# if (self.second % 60) == 0: -# rtc_now_time = self.rtc.datetime() -# print("hrTimeHandlerManager 当前的rtc时间:{}".format(rtc_now_time)) - -# print("---!self.second!!!!---:{} time_tmp:{} rtc_now_time:{}".format(self.second,time_tmp,rtc_now_time)) - -# class HRSTART_ProtoCol(ProtoCol): -# """心率频率数据""" -# TYPE = "hrtstart" - - -# def send(self, event, msg): -# # [SZKW*867387060319491*0008*hrtstart] -# send_data = "SZKW*%s*008*hrtstart"%(self.imei) -# MD5_SIGN = self.pack_MD5_head(send_data) -# data = "[%s%s]"%(str(MD5_SIGN),send_data) -# # print("HRSTART_ProtoCol:send:%s"%(data)) -# # 通过socket发送到服务器端 -# EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - -# def recv(self, event, msg): -# """ -# @param event: 心率数据下发 -# @param msg: 接收到的下行数据 -# """ -# # b'SZKW*860132060004322*0035*REMIND,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02' -# # print("REMIND_ProtoCol RECV msg:%s"%(msg)) -# # HRSTART_ProtoCol RECV msg:b'SZKW*860132060004322*000D*hrtstart,7200' msg_:7200 -# msg = msg[1:-1] -# msg_tmp = msg.decode('ascii') -# msg_tmp = msg_tmp.split(',') -# msg_tmp = msg_tmp[1] -# # print("HRSTART_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp)) -# hrTotal = int(msg_tmp) -# if hrTotal == 1:#单次测量 -# get_hr_state = EventMesh.publish("get_hr_state") -# get_spo2_state = EventMesh.publish("get_spo2_state") -# if get_hr_state == 0 or get_spo2_state == 3:#只要两个不在测量 单次优先级最低 -# EventMesh.publish("set_hr_state",3)#3代表单次测量 -# elif hrTotal > 1: -# if hrTotal <= 300: -# hrTotal = 300 -# storage_tmp = EventMesh.publish("get_storage_data") -# storage_tmp["measure_time"] = hrTotal -# EventMesh.publish("set_storage_data", storage_tmp) -# with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: -# ujson.dump(storage_tmp,fd) - -# EventMesh.publish("set_time_hr_spo2",hrTotal) - -# EventMesh.publish(constants.PROTOCOL.HRTSTART_SEND) - -# class HEART_ProtoCol(ProtoCol): -# """心率数据""" -# TYPE = "heart" - - -# def send(self, event, msg): -# # [SZKW*334588000000156*len*heart,x] -# # print("HEART:send:{}".format(msg)) -# len_size = len(str(msg))+6 -# send_data = "SZKW*%s*%04X*heart"%(self.imei,len_size) -# MD5_SIGN = self.pack_MD5_head(send_data) -# data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) -# # print("HEART_ProtoCol:data:%s"%(data)) -# # 通过socket发送到服务器端 -# EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - -# def recv(self, event, msg): -# """ -# @param event: 心率数据下发 -# @param msg: 接收到的下行数据 -# """ -# # print("HRSTART_ProtoCol RECV msg:") -# #EventMesh.publish(constants.PROTOCOL.HEART_SEND) -# class OXYGEN_ProtoCol(ProtoCol): -# """上传血氧测试数据""" -# TYPE = "oxygen" -# def send(self, event, msg): -# # [SZKW*334588000000156*len*heart,x] -# # print("oxstart:send:{}".format(msg)) -# len_size = len(str(msg))+6 -# send_data = "SZKW*%s*%04X*oxygen"%(self.imei,len_size) -# MD5_SIGN = self.pack_MD5_head(send_data) -# data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg) -# # print("HEART_ProtoCol:data:%s"%(data)) -# # 通过socket发送到服务器端 -# EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - -# def recv(self, event, msg): -# """ -# @param event: 心率数据下发 -# @param msg: 接收到的下行数据 -# """ -# # print("HRSTART_ProtoCol RECV msg:") -# #EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND) - -# class OXYGEN_One_ProtoCol(ProtoCol):#单次测量 -# """上传血氧测试数据""" -# TYPE = "oxstart" - -# # 终端发送[XT*YYYYYYYYYYYYYYY*LEN*oxygen,x] -# # x 表示血氧饱和度 -# # 示例[XT*334588000000156*0009*oxygen,15] -# # 平台回复:handler -> b'[SZKW*860132060004322*0009*oxstart,1]' -# # [XT*334588000000156*0006*oxygen] -# def send(self, event, msg): -# # [SZKW*334588000000156*len*heart,x] -# print("oxstart:") -# send_data = "SZKW*%s*0007*oxstart"%(self.imei) -# MD5_SIGN = self.pack_MD5_head(send_data) -# data = "[%s%s]"%(str(MD5_SIGN),send_data) -# # print("HEART_ProtoCol:data:%s"%(data)) -# # 通过socket发送到服务器端 -# EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data) - -# def recv(self, event, msg): -# """ -# @param event: 血氧单次测量下发 -# @param msg: 接收到的下行数据 -# """ -# print("oxstart:{}".format(msg)) -# msg = msg[1:-1] -# msg_tmp = msg.decode('ascii') -# msg_tmp = msg_tmp.split(',') -# msg_tmp = msg_tmp[1] -# state = int(msg_tmp) -# get_hr_state = EventMesh.publish("get_hr_state") -# get_spo2_state = EventMesh.publish("get_spo2_state") -# if state == 1: -# if get_hr_state == 3 or get_spo2_state == 0:#只要两个不在测量 单次优先级最低 -# EventMesh.publish("set_spo2_state",3)#3代表单次测量 -# EventMesh.publish(constants.PROTOCOL.OXSTART_SEND) - -# #设置和获取心率上传频率时间 - -# class getHrTimeManager(Abstract): -# def __init__(self): -# self.set_time = 0 -# self.set_hr = 0 #0关闭 1手动 2 自动测量按照时间间隔测试心率 -# self.set_spo2 = 0 -# check = ql_fs.path_exists("/ext/static/storage_file/config.json") -# if check == True: -# with open("/ext/static/storage_file/config.json","r") as fd: -# self.read_data = ujson.load(fd) -# if self.read_data != {}: -# b = str("measure_time") in self.read_data.keys() -# if b == True: -# self.set_time = self.read_data["measure_time"] - -# def post_processor_after_instantiation(self): -# EventMesh.subscribe("set_time_hr_spo2", self.set_time_hr_spo2) -# EventMesh.subscribe("get_time_hr_spo2", self.get_time_hr_spo2) -# EventMesh.subscribe("set_hr_state", self.set_hr_state) -# EventMesh.subscribe("get_hr_state", self.get_hr_state) -# EventMesh.subscribe("set_spo2_state", self.set_spo2_state) -# EventMesh.subscribe("get_spo2_state", self.get_spo2_state) - -# def set_time_hr_spo2(self, event, msg): -# self.set_time = msg - -# def get_time_hr_spo2(self, event, msg): - -# return self.set_time - -# def set_hr_state(self, event, msg): -# self.set_hr = msg - -# def get_hr_state(self, event, msg): -# return self.set_hr - -# def set_spo2_state(self, event, msg): -# self.set_spo2 = msg - -# def get_spo2_state(self, event, msg): -# return self.set_spo2 - -# class getBrightnessManager(Abstract):#获取亮度级别 -# def __init__(self): -# self.level = 5#默认值5 -# self.read_data = {} - -# check = ql_fs.path_exists("/ext/static/storage_file/config.json") -# if check == True: -# with open("/ext/static/storage_file/config.json","r") as fd: -# self.read_data = ujson.load(fd) - -# def post_processor_after_instantiation(self): -# EventMesh.subscribe("get_brightness_level", self.get_brightness_level) -# EventMesh.subscribe("push_add_brightness_level", self.add) -# EventMesh.subscribe("push_reduce_brightness_level", self.reduce) - -# def get_brightness_level(self, event, msg): -# if self.read_data != {}: -# b = str("brightness_level") in self.read_data.keys() -# if b == True: -# self.level = self.read_data["brightness_level"] -# return self.level - -# def add(self, event, msg): -# if self.level < 10: -# self.level = self.level + 1 -# self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10) -# self.PWM_backlight.open() - -# self.read_data = EventMesh.publish("get_storage_data") -# self.read_data["brightness_level"] = self.level - -# EventMesh.publish("set_storage_data", self.read_data) -# with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: -# ujson.dump(self.read_data,fd) - -# def reduce(self, event, msg): -# if self.level > 0: -# self.level = self.level - 1 -# if self.level <= 0: -# self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 10) -# else: -# self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS,self.level, 10) - -# self.PWM_backlight.open() -# self.read_data = EventMesh.publish("get_storage_data") -# self.read_data["brightness_level"] = self.level -# EventMesh.publish("set_storage_data", self.read_data) -# with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: -# ujson.dump(self.read_data,fd) - -# class getStorageDataManager(Abstract):#获取内存数据 -# def __init__(self): -# self.read_data = {} -# check = ql_fs.path_exists("/ext/static/storage_file/config.json") -# if check == True: -# with open("/ext/static/storage_file/config.json","r") as fd: -# self.read_data = ujson.load(fd) - -# def post_processor_after_instantiation(self): -# EventMesh.subscribe("set_storage_data", self.set_storage_data) -# EventMesh.subscribe("get_storage_data", self.get_storage_data) - -# def set_storage_data(self, event, msg): -# if msg != None: -# self.read_data = msg - -# def get_storage_data(self, event, msg): -# return self.read_data - \ No newline at end of file diff --git a/3.code/1.watch/2.code/ui.py b/3.code/1.watch/2.code/ui.py deleted file mode 100644 index 8cdf7b5d..00000000 --- a/3.code/1.watch/2.code/ui.py +++ /dev/null @@ -1,3584 +0,0 @@ -import utime -import osTimer -import lvgl as lv -import EventMesh -from machine import Timer -import voiceCall -import osTimer -import constants -from misc import Power -import pm -import ujson -import audio -import ql_fs -import audio -import sms -from machine import Pin -from lcd import lcd,lcd_ctrl,tp_cst816 -from misc import PWM -import uos -import gc -# -----------------------------------------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_24.bin",24,0) - -style_font_youyuan_40 = lv.style_t() -style_font_youyuan_40.init() -style_font_youyuan_40.set_text_color(lv.color_make(0xff, 0xff, 0xff)) -style_font_youyuan_40.set_text_font_v2("font_40.bin",40,0) -#黑色 -style_font_youyuan_20_black = lv.style_t() -style_font_youyuan_20_black.init() -style_font_youyuan_20_black.set_text_color(lv.color_make(0x00, 0x00, 0x00)) -style_font_youyuan_20_black.set_text_font_v2("font_24.bin",24,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_wechat_btn = lv.style_t() -style_wechat_btn.init() -style_wechat_btn.set_bg_color(lv.color_make(0x1E, 0x26, 0xff)) -style_wechat_btn.set_border_width(0) -style_wechat_btn.set_shadow_opa(0) - -style_contact_btn = lv.style_t() -style_contact_btn.init() -style_contact_btn.set_bg_color(lv.color_make(0xff, 0xff, 0xff)) -style_contact_btn.set_border_width(0) -style_contact_btn.set_shadow_opa(0) - -style_common_bg_rect_btn_pressed = lv.style_t() -style_common_bg_rect_btn_pressed.init() -style_common_bg_rect_btn_pressed.set_bg_color(lv.color_make(0x1E, 0x26, 0xff)) -style_common_bg_rect_btn_pressed.set_bg_opa(100) -style_common_bg_rect_btn_pressed.set_border_width(0) -style_common_bg_rect_btn_pressed.set_shadow_opa(0) - -style_contact_btn_pressed = lv.style_t() -style_contact_btn_pressed.init() -style_contact_btn_pressed.set_radius(5) -style_contact_btn_pressed.set_bg_color(lv.color_make(0xff,0xff,0xff)) -style_contact_btn_pressed.set_bg_grad_color(lv.color_make(0x21,0x95,0xf6)) -style_contact_btn_pressed.set_bg_grad_dir(lv.GRAD_DIR.HOR) -style_contact_btn_pressed.set_bg_opa(217) -style_contact_btn_pressed.set_border_color(lv.color_make(0x21,0x95,0xf6)) -style_contact_btn_pressed.set_border_width(0) -style_contact_btn_pressed.set_border_opa(255) -style_contact_btn_pressed.set_text_color(lv.color_make(0x00,0x00,0x00)) - - -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_circle = lv.style_t() -style_circle.init() -style_circle.set_bg_color(lv.color_make(0xff, 0xff, 0xff)) -style_circle.set_radius(0x7FFF) - - - -from 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(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 - -PHONE_CALL_MAX_DATA = 22 - -phone_line_points = [{"x":0,"y":0},{"x":0,"y":40}] -phone_screen = None -phone_line = None -phone_label = None -phone_one = None -phone_two = None -phone_three = None -phone_four = None -phone_five = None -phone_six = None -phone_seven = None -phone_eight = None -phone_nine = None -phone_start = None -phone_zero = None -phone_hash = None -phone_call = None -phone_call_btn = None -phone_contact = None -phone_contact_btn = None -phone_delete = None -phone_delete_btn = None - -class PhoneScreen(Screen): - NAME = "Phone" - - def __init__(self): - - super().__init__() - self.meta = None - self.phone_num = '' - self.phone_list = [] - self.button = 0 - self.timer = osTimer() - self.count = 0 - - - - def initialization(self): - self.phone_num='' - self.phone_list = [] - global phone_screen ,phone_line,phone_label,phone_one,phone_two,phone_three,phone_four,phone_five,phone_six,phone_seven,phone_eight,phone_nine,phone_start,\ - phone_zero,phone_hash,phone_call,phone_call_btn,phone_contact,phone_contact_btn,phone_delete,phone_delete_btn - if phone_screen == None: - phone_screen = lv.obj() - phone_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - phone_line = lv.line(phone_screen) - phone_line.set_points(phone_line_points,2) - phone_line.set_pos(235,8) - phone_line.set_size(2,40) - phone_line.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - phone_line.add_style(style_line,0) - - phone_label = lv.label(phone_screen) - phone_label.set_pos(0, 14) - phone_label.set_size(0, 48) - phone_label.set_text(" ") - phone_label.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - phone_label.set_long_mode(lv.label.LONG.CLIP) - phone_label.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0) - - phone_one = lv.img(phone_screen) - 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, 60) - phone_one.set_size(76, 50) - - phone_two = lv.img(phone_screen) - phone_two.set_size(76, 50) - 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, 60) - - phone_three = lv.img(phone_screen) - phone_three.set_size(76, 50) - 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, 60) - - phone_four = lv.img(phone_screen) - phone_four.set_size(76, 50) - 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, 112) - - phone_five = lv.img(phone_screen) - phone_five.set_size(76, 50) - 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, 112) - - phone_six = lv.img(phone_screen) - phone_six.set_size(76, 50) - 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, 112) - - phone_seven = lv.img(phone_screen) - phone_seven.set_size(76, 50) - 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, 164) - - phone_eight = lv.img(phone_screen) - phone_eight.set_size(76, 50) - 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, 164) - - phone_nine = lv.img(phone_screen) - phone_nine.set_size(76, 50) - 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, 164) - - phone_start = lv.img(phone_screen) - phone_start.set_size(76, 50) - 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, 216) - - phone_zero = lv.img(phone_screen) - phone_zero.set_size(76, 50) - 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, 216) - - phone_hash = lv.img(phone_screen) - phone_hash.set_size(76, 50) - phone_hash.set_src("E:/static/IMAGE_NUMBER_KEYHASH_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, 216) - - phone_call = lv.img(phone_screen) - phone_call.set_size(76, 50) - 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, 270) - - phone_call_btn = lv.img(phone_screen) - phone_call_btn.set_size(76, 52) - phone_call_btn.add_flag(lv.obj.FLAG.CLICKABLE) - phone_call_btn.set_pos(3, 268) - - phone_contact = lv.img(phone_screen) - phone_contact.set_size(64, 50) - 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(87, 270) - - phone_contact_btn = lv.img(phone_screen) - phone_contact_btn.set_size(76, 52) - phone_contact_btn.add_flag(lv.obj.FLAG.CLICKABLE) - phone_contact_btn.set_pos(87, 268) - - phone_delete = lv.img(phone_screen) - phone_delete.set_size(76, 50) - 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, 270) - - phone_delete_btn = lv.img(phone_screen) - phone_delete_btn.set_size(76, 52) - phone_delete_btn.add_flag(lv.obj.FLAG.CLICKABLE) - phone_delete_btn.set_pos(161, 268) - - self.meta = phone_screen - - 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_btn.add_event_cb(lambda e: self.call(e), - lv.EVENT.CLICKED, None) - phone_contact_btn.add_event_cb(lambda e: self.contact(e), - lv.EVENT.CLICKED, None) - phone_delete_btn.add_event_cb(lambda e: self.delete(e), - lv.EVENT.CLICKED, None) - - phone_start.add_event_cb(lambda e: self.start(e), - lv.EVENT.CLICKED, None)#短按显示* - - phone_start.add_event_cb(lambda e: self.pressed_start(e), - lv.EVENT.LONG_PRESSED, None)#长按显示+ - - phone_start.add_event_cb(lambda e: self.endpressed_start(e), - lv.EVENT.RELEASED, None)#释放按键 - - - phone_hash.add_event_cb(lambda e: self.hash(e), - lv.EVENT.CLICKED, None) - - - self.phone_num='' - self.phone_list = [] - self.count = 0 - phone_label.set_text(" ") - # print("self.phone_list :{} self.phone_num:{}".format(self.phone_list,self.phone_num)) - self.timer.start(1000,1,self.refresh_line) - - def refresh_line(self,e): - - if self.count > 2 : - self.count = 1 - if (self.count%2) == 0: - phone_line.clear_flag(lv.obj.FLAG.HIDDEN) - else: - phone_line.add_flag(lv.obj.FLAG.HIDDEN) - self.count+=1 - def one(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA: - return - self.phone_list.append("1") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def two(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA: - return - self.phone_list.append("2") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def three(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA: - return - self.phone_list.append("3") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def four(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA: - return - self.phone_list.append("4") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def five(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA: - return - self.phone_list.append("5") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def six(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA: - return - self.phone_list.append("6") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def seven(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA: - return - self.phone_list.append("7") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def eight(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA: - return - self.phone_list.append("8") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def nine(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA: - return - self.phone_list.append("9") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def zero(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA:#限制拨号数量20个数字 - return - self.phone_list.append("0") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def start(self,e): - self.button = 0 - - def pressed_start(self,e): - self.button = 1 - - def endpressed_start(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA:#限制拨号数量20个数字 - return - - if self.button == 1:#长按 - self.phone_list.append("+") - else:#短按 - self.phone_list.append("*") - - self.phone_num = ''.join(self.phone_list) - self.show_num() - - def hash(self,e): - if len(self.phone_list) >= PHONE_CALL_MAX_DATA:#限制拨号数量20个数字 - return - self.phone_list.append("#") - self.phone_num = ''.join(self.phone_list) - self.show_num() - - - def delete(self,e): - if len(self.phone_list) != 0: - 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): - self.name = None - self.phonebook = {} - self.number_tmp = {} - if len(self.phone_list) != 0: - data = EventMesh.publish("get_phonebook_list") - check = data[0] - self.phonebook = data[1] - # print("check :{}".format(check)) - if check == 1:#检查通讯录 - phonebook_keys = sorted(self.phonebook.keys()) - b = str(self.phone_num) in self.phonebook.values()#查找key中是否包含content电话号码 True 包含在里面 False不包含在里面 - j = 0 - if b == True: - for i in range(len(self.phonebook)): #字典 key value - #'001:张三':15521469561 - name = self.phonebook[phonebook_keys[j]] - name_value = phonebook_keys[j] - number_tmp = str(self.phone_num) - # print("name :{} number_tmp:{}".format(name,number_tmp)) - if name.find(number_tmp) != -1:#查找电话号码是否在通讯录里面 - number_f= name_value - name_s = number_f.split(':') - name_s = name_s[1] - self.name = name_s - break - j+=1 - else: - self.name = self.phone_num - else: - self.name = self.phone_num - - EventMesh.publish("save_phonenum",self.phone_num) - EventMesh.publish("save_phonename",self.name)# - voiceCall.callStart(self.phone_num) - - def show_num(self): - len_t = len(self.phone_list)*40 - if len_t > 230: - len_t = 230 - phone_label.set_size(len_t,48) - phone_label.set_pos(230-len_t,14) - 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": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -call_log_screen = None -contacts_cont_list = None -call_log_title = None -none_call_log_title = None - -CALLLOG_FLAG = 0 -class CallLogScreen(Screen): - NAME = "call_log" - - def __init__(self): - super().__init__() - self.meta = None - self.log_list = [] - self.read_call_log = {} - self.check_json = 0 - self.call_log_detail_list = None - - self.timer = osTimer() - EventMesh.subscribe("call_log_update_show_list", self.call_log_update_show_list) - - def post_processor_before_initialization(self): - read_call_log = EventMesh.publish("get_call_log_list") - self.check_json = read_call_log[0] - self.read_call_log = read_call_log[1] - - - - def call_log_update_show_list(self, event, msg): - read_call_log = EventMesh.publish("get_call_log_list") - print("read_call_log:{}".format(read_call_log)) - self.check_json = read_call_log[0] #文件是否存在 - self.read_call_log = read_call_log[1]#通话记录数据 - self.timer.start(500,0,self.reciving) - - def reciving(self,e): - self.btn_create() - - def initialization(self): - global call_log_screen,contacts_cont_list ,call_log_title ,none_call_log_title - if call_log_screen == None: - call_log_screen = lv.obj() - call_log_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - contacts_cont_list= lv.obj(call_log_screen) - contacts_cont_list.set_pos(0, 50) - contacts_cont_list.set_size(240, 270) - contacts_cont_list.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - contacts_cont_list.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - call_log_title = lv.label(call_log_screen) - 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) - - none_call_log_title = lv.label(contacts_cont_list) - none_call_log_title.set_pos(0, 120) - none_call_log_title.set_size(240, 40) - none_call_log_title.set_long_mode(lv.label.LONG.WRAP) - none_call_log_title.set_text(" ") - none_call_log_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - none_call_log_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - self.call_log_detail_list = lv.obj(call_log_screen) - self.meta = call_log_screen - - - read_call_log = EventMesh.publish("get_call_log_list") - print("read_call_log:{}".format(read_call_log)) - self.check_json = read_call_log[0] #文件是否存在 - self.read_call_log = read_call_log[1]#通话记录数据 - if self.check_json == True and self.read_call_log != {}: - none_call_log_title.set_text(" ") - else: - none_call_log_title.set_text("暂无记录") - self.btn_create() - - def btn_create(self): - global call_log_screen,contacts_cont_list ,call_log_title ,none_call_log_title - h = 0 - if call_log_screen != None: - if self.check_json == True and len(self.read_call_log) != 0: - none_call_log_title.set_text(" ") - self.call_log_detail_list.delete()#先删除一次控件 - self.call_log_detail_list = lv.obj(call_log_screen) - self.call_log_detail_list.set_pos(0, 50) - self.call_log_detail_list.set_size(240, 270) - self.call_log_detail_list.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - self.call_log_detail_list.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - sort_tmp = self.read_call_log.values() - sort_new = sorted(sort_tmp, key = lambda i: i['timesec'],reverse = True)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条 - # print("self.call_log :{} \r\n sort_new:{}\r\n".format(self.read_call_log,sort_new)) - - for sort_new_tmp in sort_new: #字典 key value - num_count = sort_new_tmp["count"]#获取通话次数 - num_name = sort_new_tmp["name"]#获取名称 - num_phonnum = sort_new_tmp["number"]#获取电话号码 - num_time = sort_new_tmp["time"]#获取电话号码 - - # print("num_count :{} num_name:{} num_time:{}".format(num_count,num_name,num_time)) - _btn = lv.btn(self.call_log_detail_list) - _btn.set_size(240,80) - _btn.set_pos(0,82*h) - _btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT) - _btn.add_event_cb(lambda e: self.calling(e), - lv.EVENT.CLICKED, None) - - - _btn_label2 = lv.label(_btn) - _btn_label2.set_pos(0, 5) - _btn_label2.set_size(0, 25) - _btn_label2.set_text(num_phonnum) - #_btn_label2.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - # - _btn_label3 = lv.label(_btn) - _btn_label3.set_pos(0, 0) - _btn_label3.set_size(0, 0) - _btn_label3.set_text("(" + str(num_count) + ")") - # _btn_label3.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - - _btn_label4 = lv.label(_btn) - _btn_label4.set_pos(0, 38) - _btn_label4.set_size(230, 30) - _btn_label4.set_text(num_phonnum) - _btn_label4.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - - _btn_label4 = lv.label(_btn) - _btn_label4.set_pos(0, 5) - _btn_label4.set_size(0, 0) - _btn_label4.set_text(num_name) - # _btn_label4.set_long_mode(lv.obj.LONG.DOT) - # _btn_label4.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - - _btn_label5 = lv.label(_btn) - _btn_label5.set_pos(0, 5) - _btn_label5.set_size(230, 28) - _btn_label5.set_text(num_name) - _btn_label5.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - h = h + 1 - else: - none_call_log_title.set_text("暂无记录") - self.call_log_detail_list.add_flag(lv.obj.FLAG.HIDDEN)#隐藏空文本 - - def calling(self,e): - global call_log_screen,contacts_cont_list ,call_log_title ,none_call_log_title - # print("e.get_text():{} {}".format(e.get_target().get_child(0).get_text(),e.get_target().get_child(3).get_text())) - phonnum = int(e.get_target().get_child(0).get_text()) - phnoname = e.get_target().get_child(3).get_text() - # print("phonnum :{} _msg:{}".format(phonnum,phnoname)) - EventMesh.publish("save_phonenum",phonnum)#保存电话号码用于界面显示获取 - - self.name = None - self.phonebook = {} - - self.call_log = {} - self.call_log_value = {} - self.read_call_log = {} - self.number_tmp = {} - - data = EventMesh.publish("get_phonebook_list") - check = data[0] - self.phonebook = data[1] - # print("check :{}".format(check)) - if check == 1:#检查通讯录 - phonebook_keys = sorted(self.phonebook.keys()) - b = str(phonnum) in self.phonebook.values()#查找key中是否包含content电话号码 True 包含在里面 False不包含在里面 - j = 0 - if b == True: - for i in range(len(self.phonebook)): #字典 key value - #'001:':15521469561 - name = self.phonebook[phonebook_keys[j]] - name_value = phonebook_keys[j] - number_tmp = str(phonnum) - # print("name :{} number_tmp:{}".format(name,number_tmp)) - if name.find(number_tmp) != -1:#查找电话号码是否在通讯录里面 - number_f= name_value - name_s = number_f.split(':') - name_s = name_s[1] - self.name = name_s - break - j+=1 - else: - self.name = phnoname - else: - self.name = phnoname - - if self.name == None: - self.name = phnoname - - EventMesh.publish("save_phonename",self.name)# - voiceCall.callStart(str(phonnum)) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -# ------------------------------拨打电话-------------dialing screen---------------------------------------------------------- -CALL_LOG_MAX = 50 -dialing_screen = None -dialing_img = None -dialing_name = None -hangup_imgbtn = None -class DialingScreen(Screen): - NAME = "dialing" - - def __init__(self): - super().__init__() - self.meta = None - - self.call_log = {} - self.call_log_value = {} - self.read_call_log = {} - self.number_tmp = {} - - def initialization(self): - global dialing_screen,dialing_img,dialing_name ,hangup_imgbtn - if dialing_screen == None: - dialing_screen = lv.obj() - dialing_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - dialing_img = lv.img(dialing_screen) - dialing_img.set_pos(80, 60) - 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_name = lv.label(dialing_screen) - dialing_name.set_pos(0, 160) - dialing_name.set_size(240, 50) - dialing_name.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - dialing_name.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - hangup_imgbtn = lv.img(dialing_screen) - 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) - hangup_imgbtn.add_event_cb(lambda e: self.hangup(e), - lv.EVENT.CLICKED, None) - self.meta = dialing_screen - - #获取字符串 - name = EventMesh.publish("get_phonename")#获取拨打电话名称 - content = EventMesh.publish("get_phonenum")#获取电话号码 - time = EventMesh.publish("screen_get_time")#获取系统时间 - - # ["15692025051","2","12:59","哥gdh符合双方和开发商开发好看的思考"], - # 格式:{"电话号码":{"timesec":'时间戳',"number":'电话号码',"name":'名字',"time":'时间',"count":'通话次数'}} - - dialing_name.set_text(name)#名称 - # dialing_content.set_text(content)#电话号码 - num = 0 - - date_tmp = utime.localtime() - time_tmp = utime.mktime(date_tmp) - # print("time_tmp:{}".format(time_tmp)) - read_call_log = EventMesh.publish("get_call_log_list") - check_json = read_call_log[0] - - if check_json == True: - self.read_call_log = read_call_log[1] - b = content in self.read_call_log.keys()#查找key中是否包含content电话号码 True 包含在里面 False不包含在里面 - if b == True:#查找是否有相同的电话号码 有就直接读出来的次数上加一 没有则从1开始加起 - number_tmp = {} - number_tmp = self.read_call_log[content] #通话次数加一 - num_tmp_t = number_tmp["count"] - # print("number_tmp:{} self.read_call_log.value:{}".format(number_tmp,self.read_call_log.values())) - else : - num_tmp_t = 0 - num = num_tmp_t - else: - num = 0 #通话次数 - - sort_tmp = {} - sort_tmp = self.read_call_log.values() - sort_new = {} - sort_new = sorted(sort_tmp, key = lambda i: i['timesec'],reverse = True)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条 - - i = 0 - # 49 50 - if len(self.read_call_log) >= CALL_LOG_MAX: - for sort_new_tmp in sort_new: #字典 key value - i+=1 # 1 - if i >= CALL_LOG_MAX:#大于50条把最后一条删除掉只保留前面50调最新的数据 - key_tmp = sort_new_tmp["number"] - del self.read_call_log[key_tmp] - tmp = {} - tmp["count"]= num+1 #通话次数 - tmp["time"]= "{}:{}".format("%02d"%(time[0][0]),"%02d"%(time[0][1]))#通湖时间 - tmp["name"]= name #名称 - tmp["timesec"]= time_tmp #时间戳 - tmp["number"] = content - - self.read_call_log[content] = tmp - with open("/ext/static/storage_file/Call_log.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_call_log,fd) - print("创建通话记录") - EventMesh.publish("set_call_log_list", [1,self.read_call_log]) - EventMesh.publish("call_log_update_show_list") - - def hangup(self,e): - voiceCall.callEnd() - - def done_return(self): - pass - #EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - pass - #EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - flag = EventMesh.publish("get_lcd_state") - if flag == 1: - EventMesh.publish(constants.EVENT.SYSTEM_SLEEP) - else: - EventMesh.publish(constants.EVENT.SYSTEM_UP) - - -message_popup_screen = None -message_popup_title = None -#信息弹窗 -class NewMessageScreen(Screen): - NAME = "message_popup" - def __init__(self): - super().__init__() - self.meta = None - - def initialization(self): - global message_popup_screen,message_popup_title - if message_popup_screen == None : - message_popup_screen = lv.obj() - message_popup_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - message_popup_title = lv.label(message_popup_screen) - message_popup_title.set_pos(0, 150) - message_popup_title.set_size(240, 40) - message_popup_title.set_text("你有新的消息") - message_popup_title.set_long_mode(lv.label.LONG.WRAP) - message_popup_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - message_popup_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - self.meta = message_popup_screen - EventMesh.publish("set_sms_clear_all_data",10) - - def done_left_to_right(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_right_to_left(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_bottom_to_top(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_top_to_bottom(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_click(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -message_full_screen = None -message_full_label = None -message_full_confirm = None -message_full_cancel = None -#信息弹窗 -class MessageFullScreen(Screen): - NAME = "message_full" - def __init__(self): - super().__init__() - self.timer = osTimer() - self.clear_state = 10 - self.meta = None - EventMesh.subscribe("sms_clear_all_data", self.sms_clear_all_data) - EventMesh.subscribe("set_sms_clear_all_data", self.set_sms_clear_all_data) - - def initialization(self): - global message_full_screen,message_full_label,message_full_confirm,message_full_cancel - if message_full_screen == None : - message_full_screen = lv.obj() - message_full_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - message_full_label = lv.label(message_full_screen) - message_full_label.set_pos(0, 100) - message_full_label.set_size(240, 40) - message_full_label.set_text("信息已满,是否清除所有?") - message_full_label.set_long_mode(lv.label.LONG.WRAP) - message_full_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - message_full_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - message_full_confirm = lv.label(message_full_screen) - message_full_confirm.set_text("确认") - message_full_confirm.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - message_full_confirm.set_size(120, 60) - message_full_confirm.set_pos(0,180) - message_full_confirm.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - message_full_confirm.add_flag(lv.obj.FLAG.CLICKABLE) - message_full_confirm.set_ext_click_area(20) - - message_full_cancel = lv.label(message_full_screen) - message_full_cancel.set_text("取消") - message_full_cancel.set_size(120, 60) - message_full_cancel.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - message_full_cancel.set_pos(120,180) - message_full_cancel.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - message_full_cancel.add_flag(lv.obj.FLAG.CLICKABLE) - message_full_cancel.set_ext_click_area(20) - self.meta = message_full_screen - - message_full_confirm.add_event_cb(lambda e: self.confirm(e),lv.EVENT.CLICKED, None) - message_full_cancel.add_event_cb(lambda e: self.concel(e),lv.EVENT.CLICKED, None) - - - self.timer.start(10*1000,0,self.return_back) - - def return_back(self, e): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def confirm(self, e): - self.clear_state = 0 - # self.timer.start(2*1000,0,self.clear_data) - sms.deleteMsg(1,4) - EventMesh.publish("load_screen", {"screen": "popup"}) - def clear_data(self, e): - sms.deleteMsg(1,4) - - def sms_clear_all_data(self, event,msg): - return self.clear_state - - def set_sms_clear_all_data(self, event,msg): - self.clear_state = msg - - def concel(self, e): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_left_to_right(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_right_to_left(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_bottom_to_top(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_top_to_bottom(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_click(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) -############短信############################### -MSG_FLAG = 0 -MSG_MAX = 5 #最大显示短信内容条数 -def msg_cb(args): - index = args[1] - storage = args[2] - print("index:{}".format(index)) - if index >= 49: - EventMesh.publish("load_screen", {"screen": "message_full"}) - else: - EventMesh.publish("load_screen", {"screen": "message_popup"}) - -sms.setCallback(msg_cb) -style_sms_bg_btn = lv.style_t() -style_sms_bg_btn.init() -#style_sms_bg_btn.set_bg_color(lv.color_make(0x00, 0xff, 0x2a)) -style_sms_bg_btn.set_bg_color(lv.color_make(0xff, 0xff, 0xff)) -style_sms_bg_btn.set_border_width(0) -style_sms_bg_btn.set_shadow_opa(0) - -msg_list_screen = None -msg_top_title = None -msg_cont_detail = None -msg_list_t = None -msg_list_t_done_img = None -no_msg_text = None - -class PopupScreen(Screen): - NAME = "popup" - - def __init__(self): - super().__init__() - # -------------------------------------------popup_menu screen---------------------------------------------------------- - self.meta = None - self.msg_detail = {} - self.msg_nums = 0 - self.sms_detail_list = None - EventMesh.subscribe("sms_updata_list_show", self.sms_create_list) - def post_processor_before_initialization(self): - self.msg_nums = sms.getMsgNums() #获取短信条数 - - def initialization(self): - global msg_list_screen,msg_top_title,msg_cont_detail,msg_list_t,msg_list_t_done_img,no_msg_text - if msg_list_screen == None : - msg_list_screen = lv.obj() - msg_list_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - msg_top_title = lv.label(msg_list_screen) - msg_top_title.set_pos(0, 10) - msg_top_title.set_size(240, 40) - msg_top_title.set_text("信息") - msg_top_title.set_long_mode(lv.label.LONG.WRAP) - msg_top_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - msg_top_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - msg_cont_detail = lv.obj(msg_list_screen) - msg_cont_detail.set_pos(0, 50) - msg_cont_detail.set_size(240, 270) - msg_cont_detail.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - - msg_list_t= lv.obj(msg_list_screen) - msg_list_t.set_pos(0, 50) - msg_list_t.set_size(240, 270) - msg_list_t.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - msg_list_t.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - msg_list_t_done_img = lv.img(msg_list_t) - msg_list_t_done_img.set_pos(53, 20) - msg_list_t_done_img.set_size(134, 117) - msg_list_t_done_img.set_src("E:/static/IMAGE_NOTICE_NONE.png") - msg_list_t_done_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - no_msg_text = lv.label(msg_list_t) - no_msg_text.set_pos(0, 210) - no_msg_text.set_size(240, 40) - no_msg_text.set_text("暂无信息") - no_msg_text.set_long_mode(lv.label.LONG.WRAP) - no_msg_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - no_msg_text.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - self.sms_detail_list = lv.obj(msg_list_screen) - self.meta = msg_list_screen - - - self.msg_nums = sms.getMsgNums() - # print("self.msg_nums:{} type:{}".format(self.msg_nums,type(sms.getMsgNums()))) - self.btn_create(0) - def sms_create_list(self,event,msg): - self.msg_nums = sms.getMsgNums() - self.btn_create(1) - - - def btn_create(self,msg): - global msg_list_screen,msg_top_title,msg_cont_detail,msg_list_t,msg_list_t_done_img,no_msg_text - count = 0 - j = 0 - print("self.msg_nums:{}".format(self.msg_nums)) - clear_state = EventMesh.publish("sms_clear_all_data") - if self.msg_nums > 0 : - msg_list_t_done_img.add_flag(lv.obj.FLAG.HIDDEN) - no_msg_text.add_flag(lv.obj.FLAG.HIDDEN) - self.sms_detail_list.delete()#先删除一次控件 - - self.sms_detail_list = lv.obj(msg_list_screen) - self.sms_detail_list.set_pos(0, 50) - self.sms_detail_list.set_size(230, 270) - self.sms_detail_list.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - self.sms_detail_list.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - if self.msg_nums > MSG_MAX: - j = self.msg_nums-MSG_MAX - for i in range(MSG_MAX): - if count > (MSG_MAX-1):#j = 16 -10 6 7 8 9 10 11 12 13 14 15 - break - tmp = sms.searchTextMsg(j) - - if tmp != -1: - msg_btn = lv.btn(self.sms_detail_list) - msg_btn.set_size(230,65) - msg_btn.set_pos(0,67*count) - msg_btn.add_style(style_sms_bg_btn, lv.PART.MAIN | lv.STATE.DEFAULT) - msg_btn.add_event_cb(lambda e: self.calling(e), - lv.EVENT.CLICKED, None) - - title = tmp[0] - # print("title:{}".format(title)) - _btn_label2 = lv.label(msg_btn) - _btn_label2.set_pos(0, 0) - _btn_label2.set_size(0, 0) - _btn_label2.set_text(title) - # _btn_label2.set_long_mode(lv.label.LONG.DOT) - # _btn_label2.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - # - detail = tmp[1] - _btn_label3 = lv.label(msg_btn) - _btn_label3.set_pos(0, 0) - _btn_label3.set_size(0, 0) - _btn_label3.set_text(detail) - # _btn_label3.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - - detail1 = tmp[1] - _btn_label4 = lv.label(msg_btn) - _btn_label4.set_pos(0, 34) - _btn_label4.set_size(180, 28) - _btn_label4.set_text(detail1) - _btn_label4.set_long_mode(lv.label.LONG.DOT) - _btn_label4.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - - title1 = tmp[0] - _btn_label5 = lv.label(msg_btn) - _btn_label5.set_pos(0, 5) - _btn_label5.set_size(180, 25) - _btn_label5.set_text(title1) - _btn_label5.set_long_mode(lv.label.LONG.DOT) - _btn_label5.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - count = count + 1 - j = j + 1 - if msg == 1: - bottom_btn = self.sms_detail_list.get_child(-1) - bottom_btn.scroll_to_view(lv.ANIM.OFF) - else: - msg_list_t_done_img.clear_flag(lv.obj.FLAG.HIDDEN) - no_msg_text.clear_flag(lv.obj.FLAG.HIDDEN) - self.sms_detail_list.add_flag(lv.obj.FLAG.HIDDEN) - no_msg_text.set_text("暂无信息") - - 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", content) - - #显示详细页面 - EventMesh.publish("load_screen", {"screen": "msg_detail"}) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - - -msg_detail_screen = None -msg_detail_title = None -msg_detail_cont = None -class MsgDetailScreen(Screen): - NAME = "msg_detail" - - def __init__(self): - super().__init__() - self.meta = None - - self.name = "" - self.contetn = "" - - - def initialization(self): - global msg_detail_screen,msg_detail_title,msg_detail_cont - if msg_detail_screen == None: - msg_detail_screen = lv.obj() - msg_detail_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - msg_detail_title = lv.label(msg_detail_screen) - 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(msg_detail_screen) - 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, 0) - msg_detail_cont.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - self.meta = msg_detail_screen - #获取字符串 - 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": "popup"}) - - def hangup(self,e): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - - -# -------------------------------------------heartrate screen---------------------------------------------------------- -heartrate_screen = None -heartrate_label = None -heartrate_done_img = None -heartrate_start_label = None -heartrate_bpm_label = None -heartrate_done_label = None -class HeartrateScreen(Screen): - NAME = "heartrate" - - - def __init__(self): - super().__init__() - self.meta = None - self.timer = osTimer() - self.point = 0 - self.heart_value = 0 - - def initialization(self): - global heartrate_screen,heartrate_label,heartrate_done_img ,heartrate_start_label,heartrate_bpm_label ,heartrate_done_label - if heartrate_screen == None: - heartrate_screen = lv.obj() - heartrate_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - heartrate_label = lv.label(heartrate_screen) - 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_screen) - 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_screen) - 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, 0xff, 0xff), lv.STATE.DEFAULT) - - - heartrate_bpm_label = lv.label(heartrate_screen) - heartrate_bpm_label.set_size(240, 40) - heartrate_bpm_label.set_pos(0, 180) - 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, 0xff, 0xff), lv.STATE.DEFAULT) - - heartrate_done_label = lv.label(heartrate_screen) - heartrate_done_label.set_size(240, 40) - heartrate_done_label.set_pos(0, 270) - heartrate_done_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - heartrate_done_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - heartrate_done_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) - self.meta = heartrate_screen - heartrate_done_label.set_text(" ") - heartrate_bpm_label.set_text(" ") - heartrate_start_label.set_text("正在测量中.") - EventMesh.publish("set_hr_state",1)#1代表手动进入测试界面 - - EventMesh.publish(constants.EVENT.START_HEART) - - def post_processor_after_initialization(self): - self.point = 0 - self.timer.start(1*1000, 1, self.start_measure) - - - - def start_measure(self,*args): - global heartrate_screen,heartrate_label,heartrate_done_img ,heartrate_start_label,heartrate_bpm_label ,heartrate_done_label - self.point = self.point + 1 - EventMesh.publish("system_sleep_rest")#防止黑屏 - self.heart_value = EventMesh.publish(constants.EVENT.GET_HEART) - # print("self.heart_value:{}".format(self.heart_value)) - if self.heart_value < 40: - self.heart_value = 0 - if self.heart_value != 0: - heartrate_start_label.set_text(" ") - heartrate_bpm_label.set_text("{} bpm".format(self.heart_value)) - else: - heartrate_bpm_label.set_text(" ") - if self.point%4 == 0 : - heartrate_start_label.set_text("正在测量中..") - if self.point%4 == 1 : - heartrate_start_label.set_text("正在测量中...") - if self.point%4 == 2 : - heartrate_start_label.set_text("正在测量中....") - if self.point%4 == 3 : - heartrate_start_label.set_text("正在测量中.") - - if self.point > 60: #测20s - self.heart_value = EventMesh.publish(constants.EVENT.GET_HEART) - if self.heart_value > 50: - EventMesh.publish("set_old_hr_data",self.heart_value) - EventMesh.publish(constants.PROTOCOL.HEART_SEND,self.heart_value) - if self.heart_value != 0: - heartrate_start_label.set_text(" ") - heartrate_bpm_label.set_text("{} bpm".format(self.heart_value)) - heartrate_done_label.set_text("测量完成") - else: - heartrate_start_label.set_text("退出,请重新测量") - - self.timer.stop() - self.point = 0 - EventMesh.publish("set_hr_state",0)#0代表关闭测试 - EventMesh.publish(constants.EVENT.STOP_HEART) - - def Close(self): - self.timer.stop() - get_hr_state = EventMesh.publish("get_hr_state") - get_spo2_state = EventMesh.publish("get_spo2_state") - if get_hr_state == 1 or get_spo2_state == 1: - EventMesh.publish("set_hr_state",0)#0代表关闭测试 - EventMesh.publish(constants.EVENT.STOP_HEART) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -# -------------------------------------------toolbox screen---------------------------------------------------------- - -toolbox_screen = None -toolbox_text_img = None -toolbox_cont = None -toolbox_step_img = None -toolbox_weather_img = None -toolbox_alarm_img = None -toolbox_sms_img = None -toolbox_countdown_img = None -toolbox_stopwatch_img = None -class ToolboxScreen(Screen): - NAME = "toolbox" - - def __init__(self): - super().__init__() - self.meta = None - - def initialization(self): - global toolbox_screen,toolbox_text_img,toolbox_cont,toolbox_step_img,toolbox_weather_img ,toolbox_alarm_img ,toolbox_sms_img ,\ - toolbox_countdown_img,toolbox_stopwatch_img - if toolbox_screen == None: - toolbox_screen = lv.obj() - toolbox_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - toolbox_screen.set_scrollbar_mode(0) - - toolbox_text_img = lv.img(toolbox_screen) - toolbox_text_img.set_pos(75, 10) - toolbox_text_img.set_size(90, 30) - toolbox_text_img.set_src("E:/static/tool/tool_text.png") - toolbox_text_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - toolbox_cont = lv.obj(toolbox_screen) - 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_img = lv.img(toolbox_cont) - toolbox_step_img.set_pos(4, 0) - toolbox_step_img.set_size(232, 80) - toolbox_step_img.add_flag(lv.obj.FLAG.CLICKABLE) - toolbox_step_img.set_src("E:/static/tool/IMAGE_SECMENU_STEP.png") - toolbox_step_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - - toolbox_weather_img = lv.img(toolbox_cont) - toolbox_weather_img.set_pos(4, 90) - toolbox_weather_img.set_size(232, 80) - toolbox_weather_img.add_flag(lv.obj.FLAG.CLICKABLE) - toolbox_weather_img.set_src("E:/static/tool/IMAGE_SECMENU_WEATHER.png") - toolbox_weather_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - - toolbox_alarm_img = lv.img(toolbox_cont) - toolbox_alarm_img.set_pos(4, 180) - toolbox_alarm_img.set_size(232, 80) - toolbox_alarm_img.add_flag(lv.obj.FLAG.CLICKABLE) - toolbox_alarm_img.set_src("E:/static/tool/IMAGE_SECMENU_ALARM.png") - toolbox_alarm_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - - - toolbox_sms_img = lv.img(toolbox_cont) - toolbox_sms_img.set_pos(4, 270) - toolbox_sms_img.set_size(232, 80) - toolbox_sms_img.add_flag(lv.obj.FLAG.CLICKABLE) - toolbox_sms_img.set_src("E:/static/tool/sms_setting.png") - toolbox_sms_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - - toolbox_countdown_img = lv.img(toolbox_cont) - toolbox_countdown_img.set_pos(4, 360) - toolbox_countdown_img.set_size(232, 80) - toolbox_countdown_img.add_flag(lv.obj.FLAG.CLICKABLE) - toolbox_countdown_img.set_src("E:/static/tool/IMAGE_SECMENU_COUNTDOWN.png") - toolbox_countdown_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - - toolbox_stopwatch_img = lv.img(toolbox_cont) - toolbox_stopwatch_img.set_pos(4, 450) - toolbox_stopwatch_img.set_size(232, 80) - toolbox_stopwatch_img.add_flag(lv.obj.FLAG.CLICKABLE) - toolbox_stopwatch_img.set_src("E:/static/tool/IMAGE_SECMENU_STOPWATCH.png") - toolbox_stopwatch_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - toolbox_step_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "step"}), lv.EVENT.CLICKED, None) - toolbox_weather_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "weather"}), lv.EVENT.CLICKED, None) - toolbox_alarm_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "clk_list"}), lv.EVENT.CLICKED, None) - toolbox_sms_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "popup"}), lv.EVENT.CLICKED, None) - toolbox_countdown_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "countdown"}), lv.EVENT.CLICKED, None) - toolbox_stopwatch_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "stopwatch"}), lv.EVENT.CLICKED, None) - self.meta = toolbox_screen - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -incoming_call_screen = None -incoming_call_img = None -incoming_call_name_label = None -incoming_call_answer = None -incoming_call_hangup = None -CALL_LOG_MAX = 50 -class IncomingCallScreen(Screen): - NAME = "incoming_call" - - def __init__(self): - super().__init__() - self.read_data = {} - self.volum_size = 8 - check_volum = ql_fs.path_exists("/ext/static/storage_file/config.json") - if check_volum == True : - with open("/ext/static/storage_file/config.json","r") as fd:#音频文件编号 - self.read_data = ujson.load(fd) - if self.read_data != {}: - b = str("volum") in self.read_data.keys() - if b == True: - self.volum_size = self.read_data["volum"] - else: - self.volum_size = 8 - else: - self.volum_size = 8 - else: - self.volum_size = 8 - self.aud = audio.Audio(0) - self.aud.set_pa(Pin.GPIO29) - self.aud.setVolume(self.volum_size) - self.call_timer = osTimer() - self.name = None - self.phonebook = {} - self.pro_state = 0 - self.meta = None - - - self.call_log = {} - self.call_log_value = {} - self.read_call_log = {} - self.number_tmp = {} - def initialization(self): - global incoming_call_screen,incoming_call_img,incoming_call_name_label,incoming_call_answer ,incoming_call_hangup - if incoming_call_screen == None : - # -------------------------------------------incoming_call screen---------------------------------------------------------- - incoming_call_screen = lv.obj() - incoming_call_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - incoming_call_img = lv.img(incoming_call_screen) - incoming_call_img.set_pos(80, 20) - 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_name_label = lv.label(incoming_call_screen) - incoming_call_name_label.set_pos(0, 140) - incoming_call_name_label.set_text(" ") - incoming_call_name_label.set_size(240, 50) - incoming_call_name_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - incoming_call_name_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - incoming_call_answer = lv.img(incoming_call_screen) - 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_screen) - 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") - 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) - self.meta = incoming_call_screen - - def post_processor_after_initialization(self): - global incoming_call_screen,incoming_call_img,incoming_call_name_label,incoming_call_answer ,incoming_call_hangup - utime.sleep_ms(200)#不加延时会切屏 - data = EventMesh.publish("get_phonebook_list") - check = data[0] - self.phonebook = data[1] - if check == 1:#先检查通讯录 - phonebook_keys = sorted(self.phonebook.keys()) - b = self.meta_info in self.phonebook.values()#查找key中是否包含content电话号码 True 包含在里面 False不包含在里面 - j = 0 - if b == True: - for i in range(len(self.phonebook)): #字典 key value - #'001:邓雪英':15521469561 - name = self.phonebook[phonebook_keys[j]] - name_value = phonebook_keys[j] - number_tmp = str(self.meta_info) - # print("name :{} number_tmp:{}".format(name,number_tmp)) - if name.find(number_tmp) != -1:#查找电话号码是否在通讯录里面 - number_f= name_value - name_s = number_f.split(':') - name_s = name_s[1] - self.name = name_s - self.pro_state = 1 - break - j+=1 - else: - self.name = str(self.meta_info) - self.pro_state = 0 - else: - self.name = str(self.meta_info) - self.pro_state = 0 - - read_call_log = EventMesh.publish("get_call_log_list") - check_call_log_json = read_call_log[0] - self.read_call_log = read_call_log[1] - if self.pro_state == 0 and check_call_log_json == 1:#电话本没有就在通话记录查找电话号码并且文件存在是查找 - - sort_tmp = self.read_call_log.values() - for sort_new_tmp in sort_tmp: #字典 key value - number = sort_new_tmp["number"] - find_ok = self.meta_info in number - # print("find_ok:{} sort_tmp :{} self.meta_info:{}\r\n".format(find_ok,number,self.meta_info)) - if find_ok == True: - name_value = sort_new_tmp["name"]#查找到相同的电话号码就退出break - self.name = name_value - break - - if self.name == None: - self.name = str(self.meta_info) - - # incoming_call_label.set_text(str(self.meta_info)) - incoming_call_name_label.set_text(self.name) - EventMesh.publish("save_phonename",self.name) - time = EventMesh.publish("screen_get_time")#获取系统时间 - - # ["15692025051","2","12:59","哥gdh符合双方和开发商开发好看的思考"], - # 格式:{"电话号码":{"timesec":'时间戳',"number":'电话号码',"name":'名字',"time":'时间',"count":'通话次数'}} - self.num = 0 - - date_tmp = utime.localtime() - time_tmp = utime.mktime(date_tmp) - # print("time_tmp:{}".format(time_tmp)) - read_call_log = EventMesh.publish("get_call_log_list") - check_json = read_call_log[0] - - if check_json == True: - self.read_call_log = read_call_log[1] - print("读取通话记录") - b = str(self.meta_info) in self.read_call_log.keys()#查找key中是否包含content电话号码 True 包含在里面 False不包含在里面 - - if b == True:#查找是否有相同的电话号码 有就直接读出来的次数上加一 没有则从1开始加起 - number_tmp = {} - number_tmp = self.read_call_log[str(self.meta_info)] #通话次数加一 - num_tmp_t = number_tmp["count"]#读取本地保存的通话次数 - else : - num_tmp_t = 0 - self.num = num_tmp_t - else: - self.num = 0 #通话次数 - - sort_tmp = {} - sort_tmp = self.read_call_log.values() - sort_new = {} - sort_new = sorted(sort_tmp, key = lambda i: i['timesec'],reverse = True)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条 - i = 0 - if len(self.read_call_log) >= CALL_LOG_MAX: - for sort_new_tmp in sort_new: #字典 key value - i+=1 # 1 - if i >= CALL_LOG_MAX:#大于50条把最后一条删除掉只保留前面50调最新的数据 - key_tmp = sort_new_tmp["number"] - del self.read_call_log[key_tmp] - - tmp = {} - self.num = self.num +1 - if self.num > 99: - self.num = 99 - tmp["count"]= self.num #通话次数 - tmp["time"]= "{}:{}".format("%02d"%(time[0][0]),"%02d"%(time[0][1]))#通话时间 - tmp["name"]= self.name #名称 - tmp["timesec"]= time_tmp #时间戳 - tmp["number"] = self.meta_info - - self.read_call_log[self.meta_info] = tmp - with open("/ext/static/storage_file/Call_log.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_call_log,fd) - print("创建通话记录") - EventMesh.publish("set_call_log_list", [1,self.read_call_log]) - EventMesh.publish("call_log_update_show_list") - - self.call_timer.start(6000, 1, self.call_timer_cb) - self.aud.play(1, 1, 'E:/static/R_CALL_mp3.mp3') #播放来电铃声 - - def call_timer_cb(self,e): - self.aud.play(1, 1, 'E:/static/R_CALL_mp3.mp3') #播放来电铃声 - - def answer(self,e): - self.call_timer.stop() - self.aud.stop() - voiceCall.callAnswer() - - def Close(self): - self.call_timer.stop() - self.aud.stop() - - def hangup(self,e): - self.aud.stop() - self.call_timer.stop() - voiceCall.callEnd() - - - def btn1_release(self): - pass - - def btn8_press(self): - flag = EventMesh.publish("get_lcd_state") - if flag == 1: - EventMesh.publish(constants.EVENT.SYSTEM_SLEEP) - else: - EventMesh.publish(constants.EVENT.SYSTEM_UP) - 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 - - -on_call_screen = None -on_call_label_name = None -on_call_second_label = None -on_call_hangup = None -class OnCallScreen(Screen): - NAME = "on_call" - - def __init__(self): - super().__init__() - self.meta = None - self.count_sec = 0 - self.timer = osTimer() - def initialization(self): - global on_call_screen,on_call_label_name,on_call_second_label ,on_call_hangup - if on_call_screen ==None : - on_call_screen = lv.obj() - on_call_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - on_call_label_name = lv.label(on_call_screen) - on_call_label_name.set_pos(0, 100) - on_call_label_name.set_size(240, 50) - on_call_label_name.set_text(" ") - on_call_label_name.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - on_call_label_name.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - on_call_second_label = lv.label(on_call_screen) - on_call_second_label.set_pos(0, 160) - on_call_second_label.set_size(240, 50) - on_call_second_label.set_text("00:00") - on_call_second_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - on_call_second_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - - on_call_hangup = lv.img(on_call_screen) - 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") - on_call_hangup.add_event_cb(lambda e: self.hangup(e), - lv.EVENT.CLICKED, None) - self.meta = on_call_screen - - name = EventMesh.publish("get_phonename") - on_call_label_name.set_text(name) - # on_call_label.set_text(str(self.meta_info)) - on_call_second_label.set_text("00:00") - - def post_processor_after_initialization(self): - self.count_sec = 0 - self.timer.start(1000,1,self.refresh) - - - def refresh(self,e): - global on_call_screen,on_call_label_name,on_call_second_label ,on_call_hangup - min = self.count_sec/60 - sec = self.count_sec%60 - if min > 99: - total = "%03d:%02d"%(min,sec) - else: - total = "%02d:%02d"%(min,sec) - on_call_second_label.set_text(str(total)) - self.count_sec+=1 - - def hangup(self,e): - voiceCall.callEnd() - - - def btn1_release(self): - pass - #EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - flag = EventMesh.publish("get_lcd_state") - if flag == 1: - EventMesh.publish(constants.EVENT.SYSTEM_SLEEP) - else: - EventMesh.publish(constants.EVENT.SYSTEM_UP) - #EventMesh.publish("load_screen", {"screen": "main_menu"}) -# -------------------------------------------step screen----------------------------------------------------------# - -step_screen = None -step_label = None -step_label_01 = None -step_img = None -class StepScreen(Screen): - NAME = "step" - - def __init__(self): - super().__init__() - self.meta = None - self.timer = osTimer() - - def initialization(self): - global step_screen,step_label ,step_label_01 ,step_img - if step_screen == None: - step_screen = lv.obj() - step_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - step_label = lv.label(step_screen) - 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_screen) - step_label_01.set_pos(0, 100) - step_label_01.set_size(240, 50) - step_label_01.set_text("0æ­¥") - 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_screen) - 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) - self.meta = step_screen - - step = EventMesh.publish(constants.EVENT.GET_STEP) - step_label_01.set_text("{}æ­¥".format(step[0])) - self.timer.start(1000, 1, self.revcing) - - def revcing(self, *args, **kwargs): - global step_screen,step_label ,step_label_01 ,step_img - step = EventMesh.publish(constants.EVENT.GET_STEP) - step_label_01.set_text("{}æ­¥".format(step[0])) - - def Close(self): - self.timer.stop() - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "toolbox"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "toolbox"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -# -------------------------------------------weather screen---------------------------------------------------------- - -weather_screen = None -weather_img = None -no_weather_img = None -weather_tem_label = None -no_weather_degree = None -weather_detail_label = None -weather_location_label = None -no_connect_label = None -no_connect_label1 = None -class WeatherScreen(Screen): - NAME = "weather" - - def __init__(self): - super().__init__() - self.meta = None - self.weather_data = {} - EventMesh.subscribe("updata_weather_show", self.update_weather_data) - - def initialization(self): - global weather_screen,weather_img,no_weather_img,weather_tem_label,no_weather_degree,\ - weather_detail_label,weather_location_label,no_connect_label ,no_connect_label1 - if weather_screen == None : - weather_screen = lv.obj() - weather_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - weather_img = lv.img(weather_screen) - weather_img.set_pos(10, 10) - weather_img.set_size(135, 120) - - weather_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - no_weather_img = lv.img(weather_screen) - no_weather_img.set_pos(10, 10) - no_weather_img.set_size(135, 120) - no_weather_img.set_src("E:/static/update.png") - no_weather_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - weather_tem_label = lv.label(weather_screen) - weather_tem_label.set_pos(155, 44) - weather_tem_label.set_size(60, 50) - weather_tem_label.set_text("_ _") - 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) - - no_weather_degree = lv.img(weather_screen) - no_weather_degree.set_pos(200, 40) - no_weather_degree.set_size(22, 22) - no_weather_degree.set_src("E:/static/degree.png") - no_weather_degree.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - weather_detail_label = lv.label(weather_screen) - weather_detail_label.set_pos(155, 80) - weather_detail_label.set_size(85, 50) - weather_detail_label.set_text("-/-") - 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_screen) - weather_location_label.set_pos(0, 200) - weather_location_label.set_size(240, 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) - - no_connect_label = lv.label(weather_screen) - no_connect_label.set_pos(0, 200) - no_connect_label.set_size(240, 40) - no_connect_label.set_text("找不到服务器") - no_connect_label.set_long_mode(lv.label.LONG.WRAP) - no_connect_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - no_connect_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - no_connect_label1 = lv.label(weather_screen) - no_connect_label1.set_pos(0, 250) - no_connect_label1.set_size(240, 70) - no_connect_label1.set_text("请联网后重试") - no_connect_label1.set_long_mode(lv.label.LONG.WRAP) - no_connect_label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - no_connect_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - self.meta = weather_screen - - def post_processor_after_initialization(self): - EventMesh.publish("updata_weather_show") - - - def update_weather_data(self, event, msg): - global weather_screen,weather_img,no_weather_img,weather_tem_label,no_weather_degree,\ - weather_detail_label,weather_location_label,no_connect_label ,no_connect_label1 - connect = EventMesh.publish(constants.EVENT.GET_CONNECT) #获取网络状态 - self.weather_data = EventMesh.publish("get_weather_data") - if weather_screen != None: - if connect != 0 and self.weather_data != None: - no_data = self.weather_data[8] - if no_data != 0 : - no_weather_img.add_flag(lv.obj.FLAG.HIDDEN) - weather_img.clear_flag(lv.obj.FLAG.HIDDEN) - no_connect_label.set_text(" ") - no_connect_label1.set_text(" ") - # print("self.weather_data:{}".format(self.weather_data)) - type = self.weather_data[3] - if type == None: - weather_img.set_src("E:/static/update.png")#天气类型 - else: - weather_img.set_src("E:/static/{}_weather.png".format(type))#天气类型 - - temp = self.weather_data[4] - if temp == None: - weather_tem_label.set_text("_ _") - else: - weather_tem_label.set_text("{}".format(temp)) - - date = self.weather_data[0] - if date != '{}': - date_month = date.split('-')[1] - date_day = date.split('-')[2] - weather_detail_label.set_text("{}/{}".format(date_month,date_day))#天气更新时间 - else: - weather_detail_label.set_text("-/-") - - city = self.weather_data[7] - if city != '{}': - weather_location_label.set_text("{}".format(city))#城市 - else: - weather_location_label.set_text("--") - else:#已联网未获取到天气数据 - weather_location_label.set_text(" ") - weather_detail_label.set_text("-/-") - weather_tem_label.set_text("_ _") - - no_connect_label.set_text("未获取网络数据") - no_connect_label1.set_text("请稍候重试") - - else: - weather_location_label.set_text(" ") - weather_detail_label.set_text("-/-") - weather_tem_label.set_text("_ _") - - no_weather_img.clear_flag(lv.obj.FLAG.HIDDEN) - weather_img.add_flag(lv.obj.FLAG.HIDDEN) - no_connect_label.set_text("找不到服务器") - no_connect_label1.set_text("请联网后重试") - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "toolbox"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "toolbox"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -import audio -from machine import Pin - - - - -# -----------------------------联系人--------------contacts screen---------------------------------------------------------- - -CONTACT_FLAG = 0 -contacts_screen = None -contacts_cont = None -contacts_top_title = None -contact_none_label = None -class ContactsScreen(Screen): - NAME = "contacts" - - def __init__(self): - super().__init__() - self.meta = None - self.phonebook = {} - self.count = 0 - self.phone_num_count = 0 - self.phone_num = {} - self.name = [] - self.check_json = 0 - self.timer = osTimer() - self.contact_detail_list = None - EventMesh.subscribe("contact_updata_list_show", self.btn_create_list) - - def post_processor_before_initialization(self): - data = EventMesh.publish("get_phonebook_list") - self.check_json = data[0] - self.phonebook = data[1] - self.count = 0 - - def initialization(self): - global contacts_screen,contacts_cont,contacts_top_title,contact_none_label - if contacts_screen == None: - contacts_screen = lv.obj() - contacts_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - contacts_screen.set_scrollbar_mode(0) - - contacts_cont= lv.obj(contacts_screen) - contacts_cont.set_pos(0, 50) - contacts_cont.set_size(240, 270) - contacts_cont.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - contacts_cont.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - contacts_top_title = lv.label(contacts_screen) - contacts_top_title.set_pos(0, 10) - contacts_top_title.set_size(240, 40) - contacts_top_title.set_text("联系人") - contacts_top_title.set_long_mode(lv.label.LONG.WRAP) - contacts_top_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - contacts_top_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - - - contact_none_label = lv.label(contacts_cont) - contact_none_label.set_pos(0, 120) - contact_none_label.set_size(240, 60) - contact_none_label.set_text("空") - contact_none_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - contact_none_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - self.meta = contacts_screen - self.contact_detail_list = lv.obj(contacts_screen) - #读取json文件中的字典放到self.phonebook中 - #创建btn - self.count = 0 - self.btn_create_list_show(0) - - def btn_create_list(self,event,msg): - self.post_processor_before_initialization() - self.timer.start(1 * 1000, 0, self.OutTime_s) - - def OutTime_s(self,e): - self.btn_create_list_show(1) - - def btn_create_list_show(self,state): - global contacts_screen,contacts_cont,contacts_top_title,contact_none_label - #读取json文件中的键作为label文本; - if self.check_json == True and len(self.phonebook) != 0: - contact_none_label.add_flag(lv.obj.FLAG.HIDDEN)#隐藏空文本 - j =0 - i = 0 - # print("self.phonebook sorted :{} len(self.phonebook) :{}".format(sorted(self.phonebook.keys()),len(self.phonebook))) - phonebook_keys = sorted(self.phonebook.keys()) - - self.contact_detail_list.delete()#先删除一次控件 - self.contact_detail_list = lv.obj(contacts_screen) - self.contact_detail_list.set_pos(0, 50) - self.contact_detail_list.set_size(240, 270) - self.contact_detail_list.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - self.contact_detail_list.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - for i in range(len(self.phonebook)): #字典 key value - if j > 50: - j = 0 - j+=1 - name = self.phonebook[phonebook_keys[j-1]] - key_tmp = phonebook_keys[j-1] - - # print("name :{} key_tmp:{}".format(name,key_tmp)) - - contact_btn = lv.btn(self.contact_detail_list) - contact_btn.set_size(230,80) - contact_btn.set_pos(0,82*i ) - 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.CLICKED, None) - - contact_btn_label_1 = lv.label(contact_btn) - contact_btn_label_1.set_pos(0, 5) - contact_btn_label_1.set_size(180, 25) - contact_btn_label_1.set_text(key_tmp[4:]) - contact_btn_label_1.set_long_mode(lv.label.LONG.DOT) - contact_btn_label_1.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - - contact_btn_label_1 = lv.label(contact_btn) - contact_btn_label_1.set_pos(0, 5) - contact_btn_label_1.set_size(0, 0) - contact_btn_label_1.set_text(key_tmp) - - - contact_btn_label_2 = lv.label(contact_btn) - contact_btn_label_2.set_pos(0, 30) - contact_btn_label_2.set_size(220, 35) - contact_btn_label_2.set_text(name) - contact_btn_label_2.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) - - i += 1 - if state == 1: - bottom_btn = self.contact_detail_list.get_child(-1) - bottom_btn.scroll_to_view(lv.ANIM.OFF) - else: - contact_none_label.clear_flag(lv.obj.FLAG.HIDDEN) #显示空文本 - self.contact_detail_list.add_flag(lv.obj.FLAG.HIDDEN)#隐藏空文本 - - - - def calling(self,e): - _msg = e.get_target().get_child(1).get_text() - # print("_msg:{}".format(_msg)) - msg_tmp = _msg.split(':') - msg_tmp = msg_tmp[1] - EventMesh.publish("save_phonename", msg_tmp) - - phone_num = self.phonebook[_msg] - EventMesh.publish("save_phonenum", phone_num) - # phone_num_tmp = int(phone_num) - voiceCall.callStart(phone_num) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -# -------------------------------------------temperature screen---------------------------------------------------------- - -temperature_screen = None -temperature_bg_img = None -temperature_body_label = None -temperature_degree_img = None -temperature_value_label = None -temperature_wrist_label = None -temperature_wrist_degree_img = None -temperature_wrist_value_label = None -class TemperatureScreen(Screen): - NAME = "temperature" - - def __init__(self): - super().__init__() - self.meta = None - self.temp_timer = osTimer() - def initialization(self): - global temperature_screen,temperature_bg_img ,temperature_body_label ,temperature_degree_img ,temperature_value_label,\ - temperature_wrist_label,temperature_wrist_degree_img ,temperature_wrist_value_label - if temperature_screen == None: - temperature_screen = lv.obj() - temperature_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - temperature_bg_img = lv.img(temperature_screen) - 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_screen) - 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_screen) - 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_screen) - 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_screen) - 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_screen) - 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_screen) - 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) - self.meta = temperature_screen - EventMesh.publish(constants.EVENT.START_TEMP) - self.temp_timer.start(1*1000, 1, self.temp_timerout) - def temp_timerout(self,*args): - temp = EventMesh.publish(constants.EVENT.GET_TEMP) - print("temp:{}".format(temp)) - temperature_value_label.set_text("{}".format(temp)) - def Close(self): - EventMesh.publish(constants.EVENT.STOP_TEMP) - self.temp_timer.stop() - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -line_points = [{"x":0,"y":0},{"x":240,"y":0}] -spo2_screen = None -spo2_label_0 = None -spo2_done_img = None -spo2_label = None -spo2_label_1 = None -spo2_line = None -spo2_last_time = None -spo2_last_value = None -class Spo2Screen(Screen): - NAME = "spo2" - - def __init__(self): - super().__init__() - self.meta = None - self.timer = osTimer() - self.point = 0 - self.spo2_value = 0 - self.last_spo2_value = 0 - - def initialization(self): - global spo2_screen ,spo2_label_0 ,spo2_done_img ,spo2_label ,spo2_label_1 ,spo2_line ,spo2_last_time,spo2_last_value - if spo2_screen == None: - spo2_screen = lv.obj() - spo2_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - spo2_label_0 = lv.label(spo2_screen) - spo2_label_0.set_pos(0, 10) - spo2_label_0.set_size(240, 40) - spo2_label_0.set_text("血氧") - spo2_label_0.set_long_mode(lv.label.LONG.WRAP) - spo2_label_0.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - spo2_label_0.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - spo2_done_img = lv.img(spo2_screen) - 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_label = lv.label(spo2_screen) - 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_screen) - 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) - - - spo2_line = lv.line(spo2_screen) - spo2_line.set_points(line_points,2) - spo2_line.set_pos(0,240) - spo2_line.set_size(240,10) - spo2_line.add_style(style_line,0) - - spo2_last_time = lv.label(spo2_screen) - 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(" ") - spo2_last_time.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - - spo2_last_value = lv.label(spo2_screen) - 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(" ") - spo2_last_value.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - self.meta = spo2_screen - - self.point = 0 - self.spo2_value = 0 - self.timer.start(1*1000, 1, self.start_measure) - EventMesh.publish("set_spo2_state",1)#2代表后台进入血氧测试 - EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN) - self.last_spo2_value = EventMesh.publish("get_old_spo2_data") - spo2_label.set_text("--%") - if self.last_spo2_value == 0: - spo2_last_value.set_text(" ") - else: - spo2_last_value.set_text("{}%".format(self.last_spo2_value)) - - def start_measure(self,*args): - global spo2_screen ,spo2_label_0 ,spo2_done_img ,spo2_label ,spo2_label_1 ,spo2_line ,spo2_last_time,spo2_last_value - self.point = self.point + 1 - EventMesh.publish("system_sleep_rest")#防止黑屏 - self.spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN) - if self.spo2_value == 0: - spo2_label.set_text("--%") - else: - spo2_label.set_text("{} %".format(self.spo2_value)) - if self.point%4 == 0 : - spo2_label_1.set_text("测量中..") - if self.point%4 == 1 : - spo2_label_1.set_text("测量中...") - if self.point%4 == 2 : - spo2_label_1.set_text("测量中....") - if self.point%4 == 3 : - spo2_label_1.set_text("测量中.") - - if self.point > 60: #测20s - self.spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN) - # print("ui self.spo2_value :{}".format(self.spo2_value)) - if self.spo2_value > 85 and self.spo2_value != None: - EventMesh.publish("set_old_spo2_data",self.spo2_value) - EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,self.spo2_value) - spo2_label.set_text("{} %".format(self.spo2_value)) - if self.spo2_value == 0: - spo2_label.set_text(" ") - spo2_label_1.set_text("退出,请重新测量") - self.last_spo2_value = EventMesh.publish("get_old_spo2_data") - spo2_last_value.set_text(" ") - else: - self.last_spo2_value = self.spo2_value - spo2_last_value.set_text("{}%".format(self.last_spo2_value)) - spo2_label_1.set_text("测量完成") - time = EventMesh.publish("screen_get_time") - time_year = time[4] - time_month = time[2] - time_time =" {}:{}".format("%02d"%(time[0][0]),"%02d"%(time[0][1]))#通话时间 - spo2_last_time.set_text(str(time_year)+str(time_month)+str(time_time)) - - - - self.timer.stop() - self.point = 0 - EventMesh.publish("set_spo2_state",0)#0代表关闭测试 - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) - # spo2_last_time.set_text() - - def Close(self): - self.timer.stop() - get_hr_state = EventMesh.publish("get_hr_state") - get_spo2_state = EventMesh.publish("get_spo2_state") - if get_hr_state == 1 or get_spo2_state == 1: - EventMesh.publish("set_spo2_state",0)#0代表关闭测试 - EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) -# -------------------------------------------countdown screen---------------------------------------------------------- -countdown_screen = None -countdown_title = None -countdown_hour = None -countdown_mao = None -countdown_mao = None -countdown_mao1 = None -countdown_sec = None -countdown_hour_up = None -countdown_hour_up_btn = None -countdown_hour_down = None -countdown_hour_down_btn = None -countdown_min_up = None -countdown_min_up_btn = None -countdown_min_down = None -countdown_min_down_btn = None -countdown_sec_up = None -countdown_sec_up_btn = None -countdown_sec_down = None -countdown_sec_down_btn = None -countdown_reset_img = None -countdown_reset_imgbtn = None -countdown_start_img = None -countdown_start_imgbtn = None -countdown_stop_img = None -countdown_min = None -class CountdownScreen(Screen): - NAME = "countdown" - - def __init__(self): - super().__init__() - self.meta = None - self.timer = osTimer() - self.sec = 0 - self.min = 0 - self.hour = 0 - self.total = 0 - self.flag = 1 - self.g_state = 0 - self.g_end = 0 - self.total = 0 - - - def initialization(self): - global countdown_screen ,countdown_title,countdown_hour ,countdown_mao ,countdown_mao ,countdown_mao1 ,\ - countdown_sec ,countdown_hour_up ,countdown_hour_up_btn ,countdown_hour_down ,countdown_hour_down_btn ,\ - countdown_min_up,countdown_min_up_btn ,countdown_min_down,countdown_min_down_btn,countdown_sec_up ,\ - countdown_sec_up_btn,countdown_sec_down ,countdown_sec_down_btn ,countdown_reset_img ,countdown_reset_imgbtn ,\ - countdown_start_img,countdown_start_imgbtn,countdown_stop_img ,countdown_min - if countdown_screen == None : - countdown_screen = lv.obj() - countdown_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - countdown_title = lv.label(countdown_screen) - 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_screen) - countdown_hour.set_pos(30, 140) - countdown_hour.set_size(60, 30) - countdown_hour.set_text("00") - countdown_hour.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - countdown_hour.set_long_mode(lv.label.LONG.WRAP) - countdown_hour.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - countdown_mao = lv.label(countdown_screen) - countdown_mao.set_pos(82, 138) - countdown_mao.set_size(30, 30) - countdown_mao.set_text(":") - countdown_mao.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - countdown_mao.set_long_mode(lv.label.LONG.WRAP) - countdown_mao.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - - countdown_min = lv.label(countdown_screen) - countdown_min.set_pos(95, 140) - countdown_min.set_size(60, 30) - countdown_min.set_text("00") - countdown_min.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - countdown_min.set_long_mode(lv.label.LONG.WRAP) - countdown_min.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - countdown_mao1 = lv.label(countdown_screen) - countdown_mao1.set_pos(146, 138) - countdown_mao1.set_size(30, 30) - countdown_mao1.set_text(":") - countdown_mao1.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - countdown_mao1.set_long_mode(lv.label.LONG.WRAP) - countdown_mao1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - - countdown_sec = lv.label(countdown_screen) - countdown_sec.set_pos(160, 140) - countdown_sec.set_size(60, 30) - countdown_sec.set_text("00") - countdown_sec.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - countdown_sec.set_long_mode(lv.label.LONG.WRAP) - countdown_sec.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - countdown_hour_up = lv.img(countdown_screen) - countdown_hour_up.set_size(34, 30) - countdown_hour_up.set_pos(36, 100) - countdown_hour_up.set_src("E:/static/time_up.png") - countdown_hour_up.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - countdown_hour_up_btn= lv.img(countdown_screen) - countdown_hour_up_btn.set_size(62, 70) - countdown_hour_up_btn.set_pos(20, 80) - countdown_hour_up_btn.add_flag(lv.obj.FLAG.CLICKABLE) - - - countdown_hour_down = lv.img(countdown_screen) - countdown_hour_down.set_size(34, 30) - countdown_hour_down.set_pos(36, 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_hour_down_btn= lv.img(countdown_screen) - countdown_hour_down_btn.set_size(62, 80) - countdown_hour_down_btn.set_pos(20, 150) - countdown_hour_down_btn.add_flag(lv.obj.FLAG.CLICKABLE) - - - countdown_min_up = lv.img(countdown_screen) - countdown_min_up.set_size(34, 30) - countdown_min_up.set_pos(99, 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_up_btn= lv.img(countdown_screen) - countdown_min_up_btn.set_size(64, 70) - countdown_min_up_btn.set_pos(82, 80) - countdown_min_up_btn.add_flag(lv.obj.FLAG.CLICKABLE) - - - - countdown_min_down = lv.img(countdown_screen) - countdown_min_down.set_size(34, 30) - countdown_min_down.set_pos(99, 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_min_down_btn= lv.img(countdown_screen) - countdown_min_down_btn.set_size(64, 80) - countdown_min_down_btn.set_pos(82, 150) - countdown_min_down_btn.add_flag(lv.obj.FLAG.CLICKABLE) - - - countdown_sec_up = lv.img(countdown_screen) - countdown_sec_up.set_size(34, 30) - countdown_sec_up.set_pos(165, 100) - countdown_sec_up.set_src("E:/static/time_up.png") - countdown_sec_up.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - countdown_sec_up_btn = lv.img(countdown_screen) - countdown_sec_up_btn.set_size(64, 70) - countdown_sec_up_btn.set_pos(146, 80) - countdown_sec_up_btn.add_flag(lv.obj.FLAG.CLICKABLE) - - countdown_sec_down = lv.img(countdown_screen) - countdown_sec_down.set_size(34, 30) - countdown_sec_down.set_pos(165, 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_sec_down_btn = lv.img(countdown_screen) - countdown_sec_down_btn.set_size(64, 80) - countdown_sec_down_btn.set_pos(146, 150) - countdown_sec_down_btn.add_flag(lv.obj.FLAG.CLICKABLE) - - countdown_reset_img = lv.img(countdown_screen) - countdown_reset_img.set_size(99, 36) - countdown_reset_img.set_src("E:/static/stopwatch_reset.png") - countdown_reset_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - countdown_reset_img.set_pos(10, 260) - - countdown_reset_imgbtn = lv.img(countdown_screen) - countdown_reset_imgbtn.set_size(99, 70) - 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, 240) - - - - countdown_start_img = lv.img(countdown_screen) - countdown_start_img.set_size(99, 36) - countdown_start_img.set_src("E:/static/stopwatch_play.png") - countdown_start_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - countdown_start_img.set_pos(120, 260) - - countdown_start_imgbtn = lv.img(countdown_screen) - countdown_start_imgbtn.set_size(99, 70) - 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, 240) - - - - countdown_stop_img = lv.img(countdown_screen) - countdown_stop_img.set_size(99, 36) - countdown_stop_img.set_src("E:/static/stopwatch_stop.png") - countdown_stop_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - countdown_stop_img.set_pos(120, 260) - countdown_stop_img.add_flag(lv.obj.FLAG.HIDDEN) - countdown_start_img.clear_flag(lv.obj.FLAG.HIDDEN) - - countdown_stop_img.add_flag(lv.obj.FLAG.HIDDEN) - countdown_reset_img.clear_flag(lv.obj.FLAG.HIDDEN) - - self.meta = countdown_screen - - countdown_sec_up_btn.add_event_cb(lambda e: self.sec_up(e), - lv.EVENT.CLICKED, None) - countdown_sec_down_btn.add_event_cb(lambda e: self.sec_down(e), - lv.EVENT.CLICKED, None) - countdown_min_up_btn.add_event_cb(lambda e: self.min_up(e), - lv.EVENT.CLICKED, None) - countdown_min_down_btn.add_event_cb(lambda e: self.min_down(e), - lv.EVENT.CLICKED, None) - countdown_hour_up_btn.add_event_cb(lambda e: self.hour_up(e), - lv.EVENT.CLICKED, None) - countdown_hour_down_btn.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) - - if self.g_state == 0: - countdown_start_img.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_stop_img.add_flag(lv.obj.FLAG.HIDDEN) - countdown_reset_img.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_hour_up.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_hour_down.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_min_up.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_min_down.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_sec_up.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_sec_down.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_sec.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_min.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_hour.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_title.clear_flag(lv.obj.FLAG.HIDDEN) - self.g_end = 0 - self.total = 0 - self.hour = 0 - self.min = 0 - self.sec = 0 - - - 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): - global countdown_screen ,countdown_title,countdown_hour ,countdown_mao ,countdown_mao ,countdown_mao1 ,\ - countdown_sec ,countdown_hour_up ,countdown_hour_up_btn ,countdown_hour_down ,countdown_hour_down_btn ,\ - countdown_min_up,countdown_min_up_btn ,countdown_min_down,countdown_min_down_btn,countdown_sec_up ,\ - countdown_sec_up_btn,countdown_sec_down ,countdown_sec_down_btn ,countdown_reset_img ,countdown_reset_imgbtn ,\ - countdown_start_img,countdown_start_imgbtn,countdown_stop_img ,countdown_min - self.total = self.hour*60*60 + self.min*60 + self.sec - print("--00:",self.total,self.hour,self.min,self.sec,self.g_state) - if self.g_state == 1: - self.g_state = 2 - self.stop() - elif self.g_state == 2: - self.g_state = 1 - if self.total > 0: - if self.g_state != 2: - self.g_state = 1 - self.g_end = 0 - self.show_value() - self.timer.start(1000,1,self.fun) - countdown_hour_up.add_flag(lv.obj.FLAG.HIDDEN) - countdown_hour_down.add_flag(lv.obj.FLAG.HIDDEN) - countdown_hour_up.add_flag(lv.obj.FLAG.HIDDEN) - countdown_hour_down.add_flag(lv.obj.FLAG.HIDDEN) - countdown_min_up.add_flag(lv.obj.FLAG.HIDDEN) - countdown_min_down.add_flag(lv.obj.FLAG.HIDDEN) - countdown_sec_up.add_flag(lv.obj.FLAG.HIDDEN) - countdown_sec_down.add_flag(lv.obj.FLAG.HIDDEN) - countdown_start_img.add_flag(lv.obj.FLAG.HIDDEN) - countdown_stop_img.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_reset_img.clear_flag(lv.obj.FLAG.HIDDEN) - - - def stop(self): - global countdown_screen ,countdown_title,countdown_hour ,countdown_mao ,countdown_mao ,countdown_mao1 ,\ - countdown_sec ,countdown_hour_up ,countdown_hour_up_btn ,countdown_hour_down ,countdown_hour_down_btn ,\ - countdown_min_up,countdown_min_up_btn ,countdown_min_down,countdown_min_down_btn,countdown_sec_up ,\ - countdown_sec_up_btn,countdown_sec_down ,countdown_sec_down_btn ,countdown_reset_img ,countdown_reset_imgbtn ,\ - countdown_start_img,countdown_start_imgbtn,countdown_stop_img ,countdown_min - print("in stop") - countdown_hour_up.add_flag(lv.obj.FLAG.HIDDEN) - countdown_hour_down.add_flag(lv.obj.FLAG.HIDDEN) - countdown_hour_up.add_flag(lv.obj.FLAG.HIDDEN) - countdown_hour_down.add_flag(lv.obj.FLAG.HIDDEN) - countdown_min_up.add_flag(lv.obj.FLAG.HIDDEN) - countdown_min_down.add_flag(lv.obj.FLAG.HIDDEN) - countdown_sec_up.add_flag(lv.obj.FLAG.HIDDEN) - countdown_sec_down.add_flag(lv.obj.FLAG.HIDDEN) - countdown_start_img.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_stop_img.add_flag(lv.obj.FLAG.HIDDEN) - countdown_reset_img.clear_flag(lv.obj.FLAG.HIDDEN) - - self.g_end = 0 - self.timer.stop() - # self.show_value() - # EventMesh.publish("load_screen", {"screen": "countdown"}) - - def fun(self,e): - self.hour = self.total//3600 - self.min = self.total%3600//60 - - self.show_value() - - if self.total <= 0: - self.g_state = 0 - self.g_end = 1 - self.timer.stop() - EventMesh.publish("load_screen", {"screen": "countdown_end"}) - - self.total = self.total - 1 - - self.sec = self.sec - 1 - if self.sec < 0: - self.sec = 59 - - - def reset(self,e): - global countdown_screen ,countdown_title,countdown_hour ,countdown_mao ,countdown_mao ,countdown_mao1 ,\ - countdown_sec ,countdown_hour_up ,countdown_hour_up_btn ,countdown_hour_down ,countdown_hour_down_btn ,\ - countdown_min_up,countdown_min_up_btn ,countdown_min_down,countdown_min_down_btn,countdown_sec_up ,\ - countdown_sec_up_btn,countdown_sec_down ,countdown_sec_down_btn ,countdown_reset_img ,countdown_reset_imgbtn ,\ - countdown_start_img,countdown_start_imgbtn,countdown_stop_img ,countdown_min - # print("in reset") - self.timer.stop() - self.hour = 0 - self.min = 0 - self.sec = 0 - self.g_state = 0 - self.g_end = 0 - countdown_start_img.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_stop_img.add_flag(lv.obj.FLAG.HIDDEN) - countdown_reset_img.clear_flag(lv.obj.FLAG.HIDDEN) - - countdown_hour_up.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_hour_down.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_min_up.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_min_down.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_sec_up.clear_flag(lv.obj.FLAG.HIDDEN) - countdown_sec_down.clear_flag(lv.obj.FLAG.HIDDEN) - self.show_value() - - def show_value(self): - global countdown_screen ,countdown_title,countdown_hour ,countdown_mao ,countdown_mao ,countdown_mao1 ,\ - countdown_sec ,countdown_hour_up ,countdown_hour_up_btn ,countdown_hour_down ,countdown_hour_down_btn ,\ - countdown_min_up,countdown_min_up_btn ,countdown_min_down,countdown_min_down_btn,countdown_sec_up ,\ - countdown_sec_up_btn,countdown_sec_down ,countdown_sec_down_btn ,countdown_reset_img ,countdown_reset_imgbtn ,\ - countdown_start_img,countdown_start_imgbtn,countdown_stop_img ,countdown_min - countdown_sec.set_text(str("%02d"%(self.sec))) - countdown_min.set_text(str("%02d"%(self.min))) - countdown_hour.set_text(str("%02d"%(self.hour))) - - - def done_return(self): - if self.g_state == 0: - self.timer.stop() - if self.g_end == 1: - EventMesh.publish("load_screen", {"screen": "countdown"}) - else: - EventMesh.publish("load_screen", {"screen": "toolbox"}) - - def btn1_release(self): - if self.g_state == 0: - self.timer.stop() - EventMesh.publish("load_screen", {"screen": "toolbox"}) - - def btn8_press(self): - if self.g_state == 0: - self.timer.stop() - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -#结束倒计时显示图标 -countdown_end_screen = None -countdown_end_img = None -countdown_end_label = None -class CountdownEndScreen(Screen): - NAME = "countdown_end" - - def __init__(self): - super().__init__() - self.meta = None - self.FIND_timer=osTimer() - self.aud = audio.Audio(0) - self.FIND_timer_count = 0 - - def initialization(self): - global countdown_end_screen ,countdown_end_img ,countdown_end_label - if countdown_end_screen == None: - countdown_end_screen = lv.obj() - countdown_end_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - countdown_end_img = lv.img(countdown_end_screen) - countdown_end_img.set_size(140, 140) - countdown_end_img.set_pos(50, 20) - countdown_end_img.set_src("E:/static/time_finish.png") - countdown_end_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - countdown_end_label = lv.label(countdown_end_screen) - countdown_end_label.set_pos(0, 200) - countdown_end_label.set_size(240, 40) - countdown_end_label.set_text("时间到") - countdown_end_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - countdown_end_label.set_long_mode(lv.label.LONG.WRAP) - countdown_end_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) - self.meta = countdown_end_screen - self.FIND_timer_count = 0 - self.FIND_timer.start(3000, 1, self.FIND_timer_cb) - self.aud.play(1, 1, 'E:/static/audio_audio_haixiu.mp3') #播放声音 - - def FIND_timer_cb(self, *args): - - self.FIND_timer_count += 1 - if self.FIND_timer_count >= 2: #120秒 - self.stop_FIND() - self.aud.play(1, 1, 'E:/static/audio_audio_haixiu.mp3') - - def stop_FIND(self) : - self.FIND_timer.stop() - self.aud.stopAll() - - def Close(self): - self.stop_FIND() - - def done_left_to_right(self): - EventMesh.publish("load_screen", {"screen": "countdown"}) - - def done_right_to_left(self): - EventMesh.publish("load_screen", {"screen": "countdown"}) - - def done_bottom_to_top(self): - EventMesh.publish("load_screen", {"screen": "countdown"}) - - def done_top_to_bottom(self): - EventMesh.publish("load_screen", {"screen": "countdown"}) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "countdown"}) - def done_click(self): - EventMesh.publish("load_screen", {"screen": "countdown"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "countdown"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -# -------------------------------------------stopwatch screen---------------------------------------------------------- - - -stopwatch_screen = None -stopwatch_title = None -stopwatch_label_min = None -stopwatch_mao = None -stopwatch_label_sec = None -stopwatch_mao1 = None -stopwatch_label_ms = None -stopwatch_reset_img = None -stopwatch_reset_imgbtn = None -stopwatch_start_img = None -stopwatch_start_imgbtn = None -stopwatch_stop_img = None -class StopwatchScreen(Screen): - NAME = "stopwatch" - - def __init__(self): - super().__init__() - self.meta = None - self.ms_value = 0 - self.sec_value = 0 - self.min_value = 0 - self.s_state = 0 - self.timer = osTimer() - - def initialization(self): - global stopwatch_screen,stopwatch_title,stopwatch_label_min,stopwatch_mao,stopwatch_label_sec ,\ - stopwatch_mao1 ,stopwatch_label_ms,stopwatch_reset_img ,topwatch_reset_imgbtn ,stopwatch_start_img ,\ - stopwatch_start_imgbtn, stopwatch_stop_img - if stopwatch_screen == None : - stopwatch_screen = lv.obj() - stopwatch_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - stopwatch_title = lv.label(stopwatch_screen) - 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_screen) - stopwatch_label_min.set_pos(30, 140) - stopwatch_label_min.set_size(60, 30) - stopwatch_label_min.set_text("00") - stopwatch_label_min.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - stopwatch_label_min.set_long_mode(lv.label.LONG.WRAP) - stopwatch_label_min.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - stopwatch_mao = lv.label(stopwatch_screen) - stopwatch_mao.set_pos(82, 138) - stopwatch_mao.set_size(30, 30) - stopwatch_mao.set_text(":") - stopwatch_mao.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - stopwatch_mao.set_long_mode(lv.label.LONG.WRAP) - stopwatch_mao.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - - stopwatch_label_sec = lv.label(stopwatch_screen) - stopwatch_label_sec.set_pos(95, 140) - stopwatch_label_sec.set_size(60, 30) - stopwatch_label_sec.set_text("00") - stopwatch_label_sec.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - stopwatch_label_sec.set_long_mode(lv.label.LONG.WRAP) - stopwatch_label_sec.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - stopwatch_mao1 = lv.label(stopwatch_screen) - stopwatch_mao1.set_pos(146, 138) - stopwatch_mao1.set_size(30, 30) - stopwatch_mao1.set_text(".") - stopwatch_mao1.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - stopwatch_mao1.set_long_mode(lv.label.LONG.WRAP) - stopwatch_mao1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - - stopwatch_label_ms = lv.label(stopwatch_screen) - stopwatch_label_ms.set_pos(160, 140) - stopwatch_label_ms.set_size(60, 30) - stopwatch_label_ms.set_text("0") - stopwatch_label_ms.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - stopwatch_label_ms.set_long_mode(lv.label.LONG.WRAP) - stopwatch_label_ms.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) - - - - - stopwatch_reset_img = lv.img(stopwatch_screen) - stopwatch_reset_img.set_size(99, 36) - stopwatch_reset_img.set_src("E:/static/stopwatch_reset.png") - stopwatch_reset_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - stopwatch_reset_img.set_pos(10, 210) - - stopwatch_reset_imgbtn = lv.img(stopwatch_screen) - stopwatch_reset_imgbtn.set_size(99, 76) - stopwatch_reset_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) - stopwatch_reset_imgbtn.set_pos(10, 190) - - - stopwatch_start_img = lv.img(stopwatch_screen) - stopwatch_start_img.set_size(99, 36) - stopwatch_start_img.set_src("E:/static/stopwatch_play.png") - stopwatch_start_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - stopwatch_start_img.set_pos(115, 210) - - - stopwatch_start_imgbtn = lv.img(stopwatch_screen) - stopwatch_start_imgbtn.set_size(99, 76) - stopwatch_start_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) - stopwatch_start_imgbtn.set_pos(115, 190) - - - stopwatch_stop_img = lv.img(stopwatch_screen) - stopwatch_stop_img.set_size(99, 36) - stopwatch_stop_img.set_src("E:/static/stopwatch_stop.png") - stopwatch_stop_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - stopwatch_stop_img.set_pos(115, 210) - stopwatch_stop_img.add_flag(lv.obj.FLAG.HIDDEN) - 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) - self.meta = stopwatch_screen - - if self.s_state == 0: - self.reset(0) - - def start(self, e): - global stopwatch_screen,stopwatch_title,stopwatch_label_min,stopwatch_mao,stopwatch_label_sec ,\ - stopwatch_mao1 ,stopwatch_label_ms,stopwatch_reset_img ,topwatch_reset_imgbtn ,stopwatch_start_img ,\ - stopwatch_start_imgbtn, stopwatch_stop_img - print("stopwatch start:{}".format(self.s_state)) - #self.timer.start(100, 1, self._fun) - if self.s_state == 1: - self.s_state = 2 - self.paused() - elif self.s_state == 2: - self.s_state = 1 - if self.s_state != 2: - self.s_state = 1 - self.timer.start(100,1,self._fun) - stopwatch_stop_img.clear_flag(lv.obj.FLAG.HIDDEN) - stopwatch_start_img.add_flag(lv.obj.FLAG.HIDDEN) - - - def paused(self): - global stopwatch_screen,stopwatch_title,stopwatch_label_min,stopwatch_mao,stopwatch_label_sec ,\ - stopwatch_mao1 ,stopwatch_label_ms,stopwatch_reset_img ,topwatch_reset_imgbtn ,stopwatch_start_img ,\ - stopwatch_start_imgbtn, stopwatch_stop_img - print("stopwatch pause") - stopwatch_start_img.clear_flag(lv.obj.FLAG.HIDDEN) - stopwatch_stop_img.add_flag(lv.obj.FLAG.HIDDEN) - self.timer.stop() - self.show_value() - - def reset(self,e): - global stopwatch_screen,stopwatch_title,stopwatch_label_min,stopwatch_mao,stopwatch_label_sec ,\ - stopwatch_mao1 ,stopwatch_label_ms,stopwatch_reset_img ,topwatch_reset_imgbtn ,stopwatch_start_img ,\ - stopwatch_start_imgbtn, stopwatch_stop_img - print("stopwatch reset") - - self.sec_value = 0 - self.min_value = 0 - self.ms_value = 0 - self.s_state = 0 - stopwatch_start_img.clear_flag(lv.obj.FLAG.HIDDEN) - stopwatch_stop_img.add_flag(lv.obj.FLAG.HIDDEN) - 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 > 99: - self.timer.stop() - self.show_value() - - def show_value(self): - global stopwatch_screen,stopwatch_title,stopwatch_label_min,stopwatch_mao,stopwatch_label_sec ,\ - stopwatch_mao1 ,stopwatch_label_ms,stopwatch_reset_img ,topwatch_reset_imgbtn ,stopwatch_start_img ,\ - stopwatch_start_imgbtn, stopwatch_stop_img - stopwatch_label_ms.set_text(str("%d"%(self.ms_value))) - stopwatch_label_sec.set_text(str("%02d"%(self.sec_value))) - stopwatch_label_min.set_text(str("%02d"%(self.min_value))) - - def done_return(self): - if self.s_state == 0: - self.timer.stop() - EventMesh.publish("load_screen", {"screen": "toolbox"}) - - def btn1_release(self): - if self.s_state == 0: - self.timer.stop() - EventMesh.publish("load_screen", {"screen": "toolbox"}) - - def btn8_press(self): - if self.s_state == 0: - self.timer.stop() - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -FIND_screen = None -watchface_mpsignal_img = None -class UIFINDScreen(Screen): - NAME = "FIND" - def __init__(self): - super().__init__() - self.read_data = {} - self.volum_size = 8 - check_volum = ql_fs.path_exists("/ext/static/storage_file/config.json") - if check_volum == True : - with open("/ext/static/storage_file/config.json","r") as fd:#音频文件编号 - self.read_data = ujson.load(fd) - if self.read_data != {}: - b = str("volum") in self.read_data.keys() - if b == True: - self.volum_size = self.read_data["volum"] - else: - self.volum_size = 8 - else: - self.volum_size = 8 - else: - self.volum_size = 8 - self.aud = audio.Audio(0) - self.aud.set_pa(Pin.GPIO29) - self.aud.setVolume(self.volum_size) - self.FIND_timer = osTimer() - self.FIND_timer_count = 0 - - self.meta = None - - def initialization(self): - global FIND_screen ,watchface_mpsignal_img - if FIND_screen ==None: - FIND_screen = lv.obj() - FIND_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - # add style for watchface - FIND_screen.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT) - #进入图片 - watchface_mpsignal_img = lv.img(FIND_screen) - watchface_mpsignal_img.set_pos(int(40),int(45)) - watchface_mpsignal_img.set_size(160,230) - watchface_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - watchface_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE) - watchface_mpsignal_img.set_src("E:/static/find_phone.png") - watchface_mpsignal_img.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT) - self.meta = FIND_screen - - - def post_processor_after_initialization(self): - utime.sleep_ms(200)#不加延时会切屏 - self.FIND_timer.start(3000, 1, self.FIND_timer_cb) - self.aud.play(1, 1, 'E:/static/audio_audio_haixiu.mp3') #播放声音 - pass - def FIND_timer_cb(self, *args): - self.aud.play(1, 1, '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 Close(self): - self.stop_FIND() - - def done_left_to_right(self): - - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_right_to_left(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_bottom_to_top(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_top_to_bottom(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_click(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -Lowpower_screen = None -Lowpower_screen_img = None -class LowPowerScreen(Screen): - NAME = "LOW_POWER" - def __init__(self): - super().__init__() - self.meta = None - - def initialization(self): - global Lowpower_screen ,Lowpower_screen_img - if Lowpower_screen == None : - Lowpower_screen = lv.obj() - Lowpower_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - # add style for watchface - Lowpower_screen.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT) - #进入图片 - Lowpower_screen_img = lv.img(Lowpower_screen) - Lowpower_screen_img.set_pos(int(40),int(45)) - Lowpower_screen_img.set_size(160,230) - Lowpower_screen_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) - Lowpower_screen_img.add_flag(lv.obj.FLAG.CLICKABLE) - Lowpower_screen_img.set_src("E:/static/low_power.png") - Lowpower_screen_img.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT) - self.meta = Lowpower_screen - - def done_left_to_right(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_right_to_left(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_bottom_to_top(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_top_to_bottom(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_click(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -#from usr.ui_WatchFaceScreen import WatchFaceScreen -class UI(object): - def __init__(self): - #self.screen = WatchFaceScreen() - #self.screen_old = self.screen - self.screen = None - self.screen_old = None - self.screen_list = [] - self.lv = lv - self.system_sleep_timer = osTimer() - self.system_sleep_timer_count = 0 - self.sleep_flag = 1 - self.level = 6 - self.read_data = {} - self.level = EventMesh.publish("get_brightness_level") - self.read_data = EventMesh.publish("get_storage_data") - self.main_flag = 0 - self.main_id = 0 - # print("self.read_data:{} self.level:{}".format(self.read_data,self.level)) - check = ql_fs.path_exists("/ext/static/storage_file/config.json") - if check == True: - with open("/ext/static/storage_file/config.json","r") as fd: - self.read_data = ujson.load(fd) - if self.read_data != {}: - b = str("brightness_level") in self.read_data.keys() - if b == True: - self.level = self.read_data["brightness_level"] - else: - self.level = 6 - self.read_data["brightness_level"] = self.level - EventMesh.publish("set_storage_data", self.read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - else: - self.level = 6 #默认是6级别 - - self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10) - self.PWM_backlight.open() - self.sleep_lock = 0 - - def post_processor_after_instantiation(self): - EventMesh.subscribe("load_screen", self.load_screen) - - 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("btn8_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("get_lcd_state", self.get_lcd_state) - EventMesh.subscribe("set_lcd_state", self.set_lcd_state) - - #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) - EventMesh.subscribe("system_sleep_rest", self.system_sleep_rest) - self.system_sleep_timer.start(1000, 1, self.system_sleep_timer_cb) - - - def get_lcd_state(self, event, key): - return self.sleep_flag - - def set_lcd_state(self, event, key): - print("key_:{}".format(key)) - self.sleep_flag = key - - def system_sleep_rest(self, event, key): - self.system_sleep_timeout_rest() - - 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 self.main_flag != 1 and self.sleep_flag == 0: - self.__lcd_on() - return - # if event == "btn1_press": - # self.screen.btn1_press() - # self.__lcd_on() - if event == "btn8_press": - self.screen.btn8_press() - if event == "btn8_long_press": - EventMesh.publish("load_screen", {"screen": "poweroff_comfirm"}) - if event == "btn1_press": - self.screen.btn1_release() - - - def btn_release(self, event, msg): - print("btn_release: {}".format(event)) - # if self.main_flag != 1 and self.sleep_flag == 0: - # self.__lcd_on() - # return - # if event == "btn1_release": - - # self.screen.btn1_release() - - def __lcd_on(self): - self.system_sleep_timeout_rest() - if self.sleep_flag == 0 : - print("__lcd_on") - if self.sleep_lock == 1: - utime.sleep_ms(200) - self.sleep_lock = 1 - self.sleep_flag = 1 - - - #lcd_ctrl.write(1) - #utime.sleep(10) - tp_cst816.resume() - lcd.lcd_display_on() - lv.autoSleep(0) - pm.autosleep(0) - utime.sleep_ms(100) - EventMesh.publish("set_lcd_state",self.sleep_flag) - self.level = EventMesh.publish("get_brightness_level") - - self.read_data = EventMesh.publish("get_storage_data") - # print("self.read_data:{} self.level:{}".format(self.read_data,self.level)) - if self.level == None: - self.level = 6 - elif self.level > 10: - self.level = 10 - elif self.level <= 0: - self.level = 1 - self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10) - self.PWM_backlight.open() - self.sleep_lock = 0 - - def publish_call_in(self, event, msg): - EventMesh.publish("load_screen", {"screen": "dialing", "meta": msg}) - - def __lcd_off(self): - - if self.sleep_flag == 1 : - print("__lcd_off") - if self.sleep_lock == 1: - utime.sleep_ms(200) - self.sleep_lock = 1 - self.sleep_flag = 0 - self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 0, 1) - self.PWM_backlight.open() - #lcd_ctrl.write(0) - #utime.sleep(10) - tp_cst816.suspend() - lcd.lcd_display_off() - lv.autoSleep(1) - pm.autosleep(1) - utime.sleep_ms(100) - EventMesh.publish("set_lcd_state",self.sleep_flag) - self.sleep_lock = 0 - - 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): - time = EventMesh.publish("get_brightness_time") - if time == None: - time = 10 - self.system_sleep_timer_count += 1 - if self.system_sleep_timer_count >= time : - self.system_sleep_timer_count = 0 - 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() - pass - - def add_screen(self, screen): - self.screen_list.append(screen) - return self - - - def load_screen(self, topic, msg): - print("msg1={}".format(msg)) - for scr in self.screen_list: - if scr.NAME == msg["screen"]: - # 每次屏幕切换开始息屏倒计时 - self.__lcd_on() - if scr.NAME == 'main_menu': - self.main_flag = 1 - else : - self.main_flag = 0 - mem = gc.mem_free() - print('1剩余内存RAM:{} KB'.format(mem / 1024)) - - 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() - mem = gc.mem_free() - print('2剩余内存RAM:{} KB'.format(mem / 1024)) - - - - - diff --git a/3.code/1.watch/2.code/ui_WatchFaceScreen.py b/3.code/1.watch/2.code/ui_WatchFaceScreen.py deleted file mode 100644 index 40588b81..00000000 --- a/3.code/1.watch/2.code/ui_WatchFaceScreen.py +++ /dev/null @@ -1,602 +0,0 @@ -#表盘 -import osTimer -import lvgl as lv -import EventMesh -import osTimer -import constants -from ui import Screen,style_screen -import ql_fs -import ujson -from machine import RTC -from ui_main_menu import MainMenu2_Watchface - - -# 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_22.bin",22,0) - -watchface_style_default = lv.style_t() -watchface_style_default.init() -watchface_style_default.set_text_color(lv.color_make(0xff, 0xff, 0xff)) -watchface_style_default.set_text_font_v2("font_24.bin",24,0) - - -style_font_youyuan_28 = lv.style_t() -style_font_youyuan_28.init() -style_font_youyuan_28.set_text_color(lv.color_make(0xFF, 0xFF, 0xFF)) -style_font_youyuan_28.set_text_font(lv.font_28_dial) - -Watchface = lv.obj() - -Watchface1 = lv.obj(Watchface) - -Watchface1.set_size(240,320) -#Watchface1.set_pos(0,0) -Watchface1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -Watchface1.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT) - -# create style style_watchface_img_default -style_watchface_img_default = lv.style_t() -style_watchface_img_default.init() -style_watchface_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff)) -style_watchface_img_default.set_img_recolor_opa(0) -style_watchface_img_default.set_img_opa(255) - - -#表盘 - -#状态栏 - -watchface1_mpsignal_img = lv.img(Watchface1) -watchface1_mpsignal_img.set_pos(int(20),int(0)) -watchface1_mpsignal_img.set_size(24,17) -watchface1_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -watchface1_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE) -watchface1_mpsignal_img.set_src("E:/static/mpsignal5.png") -watchface1_mpsignal_img.add_style(style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -watchface1_res_stat_battery_img = lv.img(Watchface1) -watchface1_res_stat_battery_img.set_pos(int(200),int(0)) -watchface1_res_stat_battery_img.set_size(30,18) -watchface1_res_stat_battery_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -watchface1_res_stat_battery_img.add_flag(lv.obj.FLAG.CLICKABLE) -watchface1_res_stat_battery_img.set_src("E:/static/vbat_100.png") -watchface1_res_stat_battery_img.add_style(style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -watchface1_res_stat_charge_in_img = lv.img(Watchface1) -watchface1_res_stat_charge_in_img.set_pos(int(180),int(0)) -watchface1_res_stat_charge_in_img.set_size(6,16) -watchface1_res_stat_charge_in_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -watchface1_res_stat_charge_in_img.add_flag(lv.obj.FLAG.CLICKABLE) -watchface1_res_stat_charge_in_img.set_src("E:/static/charge_in.png") -# add style for watchface1_res_stat_charge_in_img -watchface1_res_stat_charge_in_img.add_style(style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -#主图片 -watchface1_bg_img = lv.img(Watchface1) -watchface1_bg_img.set_pos(int(0),int(40)) -watchface1_bg_img.set_size(240,280) -watchface1_bg_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -watchface1_bg_img.add_flag(lv.obj.FLAG.CLICKABLE) -watchface1_bg_img.set_src("E:/static/watch_plate/style_1/bg.png") -watchface1_bg_img.add_style(style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) -#时间 - - -style_font_youyuan_70_black = lv.style_t() -style_font_youyuan_70_black.init() -style_font_youyuan_70_black.set_text_color(lv.color_make(0x32, 0xc8, 0xdb)) -style_font_youyuan_70_black.set_text_font(lv.font_70_bold) -#init3:(2106, 2, 7, 6, 29, 38, 6, 38) -data = RTC().datetime() -hour = data[4] -min = data[5] - -week = data[3] - -date1 = data[1] -date2 = data[2] -print("hour:{} min:{} week:{} date1:{} date2:{} data:{}".format(hour,min,week,date1,date2,data)) - -def get_week(msg): - if msg == 1: - return '一' - elif msg == 2: - return '二' - elif msg == 3: - return '三' - elif msg == 4: - return '四' - elif msg == 5: - return '五' - elif msg == 6: - return '六' - elif msg == 7 or msg == 0: - return '日' - - -watchface1_time1_text = lv.label(Watchface1) -watchface1_time1_text.set_pos(20, 50) -watchface1_time1_text.set_size(190, 71) -watchface1_time1_text.set_align(lv.TEXT_ALIGN.LEFT) -watchface1_time1_text.set_text("{}:{}".format("%02d"%(hour),"%02d"%(min))) -# watchface1_time1_text.set_text("%02d:%02d"%(hour,min)) -watchface1_time1_text.add_style(style_font_youyuan_70_black, lv.PART.MAIN|lv.STATE.DEFAULT) - -#日期 -watchface1_date_span = lv.label(Watchface1) -watchface1_date_span.set_pos(24, 118) -watchface1_date_span.set_size(140, 30) -watchface1_date_span.set_align(lv.TEXT_ALIGN.LEFT) -watchface1_date_span.set_text("%d月%d日"%(date1,date2)) -watchface1_date_span.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT) -#星期 -watchface1_week_span = lv.label(Watchface1) -watchface1_week_span.set_pos(24, 153) -watchface1_week_span.set_size(100, 30) -watchface1_week_span.set_align(lv.TEXT_ALIGN.LEFT) -watchface1_week_span.set_text("星期%s"%(get_week(week))) -watchface1_week_span.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT) - - - -watchface1_step_span = lv.label(Watchface1) -watchface1_step_span.set_pos(158, 154) -watchface1_step_span.set_size(78, 30) -watchface1_step_span.set_align(lv.TEXT_ALIGN.LEFT) -watchface1_step_span.set_text("0") -watchface1_step_span.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT) - - - -watchface1_HB_span = lv.label(Watchface1) -watchface1_HB_span.set_pos(55, 235) -watchface1_HB_span.set_size(80, 30) -watchface1_HB_span.set_align(lv.TEXT_ALIGN.LEFT) -watchface1_HB_span.set_text("0") -watchface1_HB_span.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT) - - - -watchface1_SPO2_span = lv.label(Watchface1) -watchface1_SPO2_span.set_pos(160, 235) -watchface1_SPO2_span.set_size(80, 30) -watchface1_SPO2_span.set_align(lv.TEXT_ALIGN.LEFT) -watchface1_SPO2_span.set_text("0") -watchface1_SPO2_span.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT) - - -class WatchFace1(): - NAME = "Watchface1" - # # #表盘1 - def __init__(self): - print("Watchface1:__init__") - self.meta = Watchface1 - - - def initialization(self,main_menu): - print("Watchface1:initialization") - Watchface1.set_parent(main_menu)#设置父控件 - #获取信号 - 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) - hrValue = EventMesh.publish("get_old_hr_data") - if hrValue: - self.__oldHrValue(None, hrValue) - - spo2Value = EventMesh.publish("get_old_spo2_data") - if spo2Value : - self.__oldSpo2Value(None, spo2Value) - # print("main get_step msg:{}".format(msg)) - - # step = EventMesh.publish(constants.EVENT.GET_STEP) - step = EventMesh.publish("get_old_step_value") - self.__stepValue(None, step) - - - 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) - - hrValue = EventMesh.publish("get_old_hr_data") - if hrValue: - self.__oldHrValue(None, hrValue) - - spo2Value = EventMesh.publish("get_old_spo2_data") - if spo2Value : - self.__oldSpo2Value(None, spo2Value) - # print("main get_step msg:{}".format(msg)) - # step = EventMesh.publish(constants.EVENT.GET_STEP) - step = EventMesh.publish("get_old_step_value") - self.__stepValue(None, step) - - def __time(self, event, msg): - #时间 - watchface1_time1_text.set_text("{}:{}".format("%02d"%(msg[0][0]),"%02d"%(msg[0][1]))) - - watchface1_date_span.set_text(msg[2])#日期 - 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 : - watchface1_mpsignal_img.set_src("E:/static/mpsignal{}.png".format(msg//8)) - else : - watchface1_mpsignal_img.set_src("E:/static/mpsignal5.png") - - def __battery(self, event, msg): - #print("__battery_cb:",str(msg)) - #print(msg) - if msg[0] == '1': - watchface1_res_stat_charge_in_img.set_src("E:/static/charge_in.png") - else: - watchface1_res_stat_charge_in_img.set_src("E:/static/charge_in1.png") - - watchface1_res_stat_battery_img.set_src("E:/static/vbat_%d.png"%(msg[1]))#"E:/vbat_60.png" - pass - - def __oldHrValue(self, event, msg): - watchface1_HB_span.set_text(str(msg)) - - def __oldSpo2Value(self, event, msg): - watchface1_SPO2_span.set_text(str(msg)) - - def __stepValue(self, event, msg): - if msg == None: - watchface1_step_span.set_text("0") - else: - watchface1_step_span.set_text(str(msg)) - - def Close(self): - pass - - def done_left_to_right(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def done_right_to_left(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def done_top_to_bottom(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_bottom_to_top(self): - EventMesh.publish("load_screen", {"screen": "call_log"}) - -# create style style_watchface_img_default -style_watchface_img_default = lv.style_t() -style_watchface_img_default.init() -style_watchface_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff)) -style_watchface_img_default.set_img_recolor_opa(0) -style_watchface_img_default.set_img_opa(255) - -Watchface2 = lv.obj(Watchface) -Watchface2.set_size(240,320) -#Watchface2.set_pos(0,0) -Watchface2.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -Watchface2.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT) - -#表盘 - -#状态栏 - -watchface2_mpsignal_img = lv.img(Watchface2) -watchface2_mpsignal_img.set_pos(int(20),int(0)) -watchface2_mpsignal_img.set_size(24,17) -watchface2_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -watchface2_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE) -watchface2_mpsignal_img.set_src("E:/static/mpsignal5.png") -watchface2_mpsignal_img.add_style(style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -watchface2_res_stat_battery_img = lv.img(Watchface2) -watchface2_res_stat_battery_img.set_pos(int(200),int(0)) -watchface2_res_stat_battery_img.set_size(30,18) -watchface2_res_stat_battery_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -watchface2_res_stat_battery_img.add_flag(lv.obj.FLAG.CLICKABLE) -watchface2_res_stat_battery_img.set_src("E:/static/vbat_100.png") -watchface2_res_stat_battery_img.add_style(style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -watchface2_res_stat_charge_in_img = lv.img(Watchface2) -watchface2_res_stat_charge_in_img.set_pos(int(180),int(0)) -watchface2_res_stat_charge_in_img.set_size(6,16) -watchface2_res_stat_charge_in_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -watchface2_res_stat_charge_in_img.add_flag(lv.obj.FLAG.CLICKABLE) -watchface2_res_stat_charge_in_img.set_src("E:/static/charge_in.png") -# add style for watchface_res_stat_charge_in_img -watchface2_res_stat_charge_in_img.add_style(style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -style_font_youyuan_70_red = lv.style_t() -style_font_youyuan_70_red.init() -style_font_youyuan_70_red.set_text_color(lv.color_make(0xff, 0xff, 0xff)) -style_font_youyuan_70_red.set_text_font(lv.font_70_bold) -#时间 -x = 30 -y = 80 -watchface2_time1_hour_text = lv.label(Watchface2) -watchface2_time1_hour_text.set_pos(20, 80) -watchface2_time1_hour_text.set_size(88, 70) -watchface2_time1_hour_text.set_align(lv.TEXT_ALIGN.LEFT) -watchface2_time1_hour_text.set_text("{}".format("%02d"%(hour))) -watchface2_time1_hour_text.add_style(style_font_youyuan_70_red, lv.PART.MAIN|lv.STATE.DEFAULT) - -watchface2_time1_mao_text = lv.label(Watchface2) -watchface2_time1_mao_text.set_pos(108, 76) -watchface2_time1_mao_text.set_size(44, 70) -watchface2_time1_mao_text.set_align(lv.TEXT_ALIGN.LEFT) -watchface2_time1_mao_text.set_text(":") -watchface2_time1_mao_text.add_style(style_font_youyuan_70_red, lv.PART.MAIN|lv.STATE.DEFAULT) - -watchface2_time1_hour1_text = lv.label(Watchface2) -watchface2_time1_hour1_text.set_pos(152, 80) -watchface2_time1_hour1_text.set_size(88, 70) -watchface2_time1_hour1_text.set_align(lv.TEXT_ALIGN.LEFT) -watchface2_time1_hour1_text.set_text("{}".format("%02d"%(min))) -watchface2_time1_hour1_text.add_style(style_font_youyuan_70_red, lv.PART.MAIN|lv.STATE.DEFAULT) - - - - -#日期 -watchface2_date_span = lv.label(Watchface2) -watchface2_date_span.set_pos(18, 170) -watchface2_date_span.set_size(120, 35) -watchface2_date_span.set_align(lv.TEXT_ALIGN.LEFT) -watchface2_date_span.set_text("%d月%d日"%(date1,date2)) -watchface2_date_span.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT) - -#日期 -watchface2_week = lv.label(Watchface2) -watchface2_week.set_pos(146, 170) -watchface2_week.set_size(110, 35) -watchface2_week.set_align(lv.TEXT_ALIGN.LEFT) -watchface2_week.set_text("星期%s"%(get_week(week))) -watchface2_week.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT) -#星期 - - -# watchface2_week = lv.img(Watchface2) -# watchface2_week.set_pos(int(30+56+20+25),int(y+56+30)) -# watchface2_week.set_size(90,30) -# watchface2_week.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -# watchface2_week.set_src("E:/static/watch_plate/style_2/week/0_week.png") -# watchface2_week.add_style(style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - - - -watchface2_step_img = lv.img(Watchface2) -watchface2_step_img.set_pos(int(95),int(260)) -watchface2_step_img.set_size(26,21) -watchface2_step_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -watchface2_step_img.set_src("E:/static/watch_plate/style_2/step.png") -watchface2_step_img.add_style(style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT) - -watchface2_step_txt = lv.label(Watchface2) -watchface2_step_txt.set_pos(125, 260) -watchface2_step_txt.set_size(80, 35) -watchface2_step_txt.set_align(lv.TEXT_ALIGN.LEFT) -watchface2_step_txt.set_text("0") -watchface2_step_txt.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT) - -class WatchFace2(): - NAME = "Watchface2" - # # #表盘2 - def __init__(self): - print("Watchface2:__init__") - self.meta = Watchface2 - - - def initialization(self,main_menu): - print("Watchface2:initialization") - Watchface2.set_parent(main_menu)#设置父控件 - #获取信号 - 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) - - step = EventMesh.publish("get_old_step_value") - self.__stepValue(None, step) - - - 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) - - step = EventMesh.publish("get_old_step_value") - self.__stepValue(None, step) - - 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 - watchface2_time1_hour_text.set_text("{}".format("%02d"%(msg[0][0]))) - watchface2_time1_hour1_text.set_text("{}".format("%02d"%(msg[0][1]))) - # watchface2_time1_hour_text.set_text("{}".format("%d"%(hour1_chose))) - # watchface2_time1_hour2_text.set_text("{}".format("%d"%(hour2_chose))) - # watchface2_time2_min1_text.set_text("{}".format("%d"%(min1_chose))) - # watchface2_time2_min2_text.set_text("{}".format("%d"%(min2_chose))) - watchface2_date_span.set_text(msg[2])#日期 - watchface2_week.set_text(msg[3])#星期 - # watchface2_week.set_src("E:/static/watch_plate/style_2/week/%d_week.png"%(msg[5])) #星期 - - 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 : - watchface2_mpsignal_img.set_src("E:/static/mpsignal{}.png".format(msg//8)) - else : - watchface2_mpsignal_img.set_src("E:/static/mpsignal5.png") - - def __battery(self, event, msg): - #print("__battery_cb:",str(msg)) - #print(msg) - if msg[0] == '1': - watchface2_res_stat_charge_in_img.set_src("E:/static/charge_in.png") - else: - watchface2_res_stat_charge_in_img.set_src("E:/static/charge_in1.png") - - watchface2_res_stat_battery_img.set_src("E:/static/vbat_%d.png"%(msg[1]))#"E:/vbat_60.png" - pass - def __stepValue(self, event, msg): - if msg == None: - watchface2_step_txt.set_text("0") - else: - watchface2_step_txt.set_text(str(msg)) - - - # def __weather_type(self, event, msg): - # if msg == None: - # watchface2_temp_img.add_flag(lv.obj.FLAG.HIDDEN) - # watchface2_no_temp_txt.clear_flag(lv.obj.FLAG.HIDDEN) - # else: - # type = int(msg) - # watchface2_no_temp_txt.add_flag(lv.obj.FLAG.HIDDEN) - # watchface2_temp_img.clear_flag(lv.obj.FLAG.HIDDEN) - # watchface2_temp_img.set_src("E:/static/watch_plate/style_2/%d_main2_weather.png"%(type)) - - # def __weather_value(self, event, msg): - # if msg == None: - # watchface2_temp_degree.add_flag(lv.obj.FLAG.HIDDEN) - # watchface2_no_temp_txt.clear_flag(lv.obj.FLAG.HIDDEN) - # watchface2_temp_txt.add_flag(lv.obj.FLAG.HIDDEN) - # else: - # watchface2_no_temp_txt.add_flag(lv.obj.FLAG.HIDDEN) - # watchface2_temp_txt.clear_flag(lv.obj.FLAG.HIDDEN) - # watchface2_temp_degree.clear_flag(lv.obj.FLAG.HIDDEN) - # watchface2_temp_txt.set_text(str(msg)) - - def Close(self): - pass - - def done_left_to_right(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def done_right_to_left(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - def done_top_to_bottom(self): - EventMesh.publish("load_screen", {"screen": "popup"}) - - def done_bottom_to_top(self): - EventMesh.publish("load_screen", {"screen": "call_log"}) - -class WatchFace(): - #NAME = "Watchface" - - def __init__(self): - #表盘 - self.meta = None - self.watchface_style_num = "Watchface1" - self.watchface_list = [] - self.timer_update = osTimer() - EventMesh.subscribe("set_change_face", self.change_face) - self.read_data = {} - self.PWM_backlight = None - check = ql_fs.path_exists("/ext/static/storage_file/config.json") - if check == True: - with open("/ext/static/storage_file/config.json","r") as fd: - self.read_data = ujson.load(fd) - if self.read_data != {}: - b = str("watchface") in self.read_data.keys() - if b == True: - self.watchface_style_num = self.read_data["watchface"] - else: - self.watchface_style_num = "Watchface1" - else: - self.watchface_style_num = "Watchface1" - - def initialization(self,main_menu): - if self.watchface_list == [] : #第一次初始化 - self.watchface_list.append( WatchFace1()) - self.watchface_list.append( WatchFace2()) - print("watchface INIT !!!!!!!!:",self.watchface_style_num) - for wat in self.watchface_list: - if wat.NAME == self.watchface_style_num : - self.watchface_style = wat - wat.meta.add_flag(lv.obj.FLAG.HIDDEN) #隐藏 - self.watchface_style.initialization(main_menu) - self.meta = self.watchface_style.meta - self.watchface_style.meta.clear_flag(lv.obj.FLAG.HIDDEN)#显示 - self.timer_update.start(10000, 1, self.timerout_update) - - def timerout_update(self, *args, **kwargs): - self.watchface_style.timerout_update() - - def change_face(self, event=None, msg=None): - print("change_face :",msg) - self.watchface_style_num = str(msg) - - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - # def done_left_to_right(self): - # EventMesh.publish("load_screen", {"screen": "main_menu"}) - - # def done_right_to_left(self): - # EventMesh.publish("load_screen", {"screen": "main_menu"}) - # def done_top_to_bottom(self): - # EventMesh.publish("load_screen", {"screen": "popup"}) - - # def done_bottom_to_top(self): - # EventMesh.publish("load_screen", {"screen": "call_log"}) - # 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"}) - - def Close(self): - print("watchface Close !!!!!!!!") - self.timer_update.stop() - self.watchface_style.Close() - return - - - - diff --git a/3.code/1.watch/2.code/ui_main_menu.py b/3.code/1.watch/2.code/ui_main_menu.py deleted file mode 100644 index a8173949..00000000 --- a/3.code/1.watch/2.code/ui_main_menu.py +++ /dev/null @@ -1,405 +0,0 @@ -#主菜单 -import utime -import osTimer -import lvgl as lv -import EventMesh -from machine import Timer -import voiceCall -import osTimer -import constants -from misc import Power -import pm -from 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_24.bin",24,0) - -style_font_youyuan_25 = lv.style_t() -style_font_youyuan_25.init() -style_font_youyuan_25.set_text_color(lv.color_make(0xff, 0xff, 0xff)) -style_font_youyuan_25.set_text_font_v2("font_24.bin",24,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) - - -# MainMenu = lv.obj() -# class MainMenuScreen(Screen): -# NAME = "main_menu" - -# def __init__(self): -# super().__init__() -# #主菜单 -# self.meta = MainMenu -# self.main_menu_style_num = "MainMenu2" - -# def initialization(self): -# print("main_menu INIT !!!!!!!!") -# EventMesh.publish("load_screen", {"screen": self.main_menu_style_num}) - - -# def post_processor_after_instantiation(self): -# EventMesh.subscribe("change_style", self.change_style) - - -# def change_style(self, event=None, msg=None): #换风格 -# self.main_menu_style_num = msg -# EventMesh.publish("load_screen", {"screen": self.main_menu_style_num}) - -# def Close(self): -# 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"}) - - - - - -style_font_youyuan_font_60 = lv.style_t() -style_font_youyuan_font_60.init() -style_font_youyuan_font_60.set_text_color(lv.color_make(0xFF, 0xFF, 0xFF)) -style_font_youyuan_font_60.set_text_font(lv.font_60_main_menu) - -MainMenu2 = lv.obj() -MainMenu2_til = lv.tileview(MainMenu2) -MainMenu2_til.set_scrollbar_mode(0) -MainMenu2_til.add_style(style_MainMenu_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT) -#表盘 -MainMenu2_Watchface = MainMenu2_til.add_tile(0, 1, lv.DIR.LEFT | lv.DIR.RIGHT) -label_text = lv.label(MainMenu2_Watchface) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("0") -#支付宝 -MainMenu2_alipay = MainMenu2_til.add_tile(0, 0, lv.DIR.LEFT | lv.DIR.RIGHT) -label_text = lv.label(MainMenu2_alipay) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("1") -MainMenu2_img_alipay_text = lv.label(MainMenu2_alipay) -MainMenu2_img_alipay_text.set_pos(int(0),int(220)) -MainMenu2_img_alipay_text.set_size(240,100) -MainMenu2_img_alipay_text.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_alipay_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -MainMenu2_img_alipay_text.set_text("支付宝") -MainMenu2_img_alipay_text.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) - -MainMenu2_img_alipay = lv.img(MainMenu2_alipay) -MainMenu2_img_alipay.set_size(160,160) -MainMenu2_img_alipay.set_pos(40,20) -MainMenu2_img_alipay.set_src("E:/static/main_menu/main_menu2/alipay_.png") -MainMenu2_img_alipay.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_alipay.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) - - -# label_alipay.set_long_mode(lv.label.LONG.WRAP) -# label_alipay.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -# label_alipay.add_style(style_font_youyuan_25, lv.PART.MAIN | lv.STATE.DEFAULT) -#拨号盘 -MainMenu2_phone = MainMenu2_til.add_tile(1, 0, lv.DIR.LEFT | lv.DIR.RIGHT) -label_text = lv.label(MainMenu2_phone) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("2") -MainMenu2_img_phone = lv.img(MainMenu2_phone) -MainMenu2_img_phone.set_size(160,160) -MainMenu2_img_phone.set_pos(40,20) -MainMenu2_img_phone.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.png") -MainMenu2_img_phone.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_phone.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -MainMenu2_img_phone_text = lv.label(MainMenu2_phone) -MainMenu2_img_phone_text.set_pos(int(0),int(220)) -MainMenu2_img_phone_text.set_size(240,100) -MainMenu2_img_phone_text.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_phone_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -MainMenu2_img_phone_text.set_text("拨号盘") -MainMenu2_img_phone_text.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) - - -#通讯录 -MainMenu2_contacts = MainMenu2_til.add_tile(2, 0, lv.DIR.LEFT | lv.DIR.RIGHT) -label_text = lv.label(MainMenu2_contacts) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("3") -MainMenu2_img_contacts = lv.img(MainMenu2_contacts) -MainMenu2_img_contacts.set_size(160,160) -MainMenu2_img_contacts.set_pos(40,20) -MainMenu2_img_contacts.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.png") -MainMenu2_img_contacts.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_contacts.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -MainMenu2_img_contacts_txt = lv.label(MainMenu2_contacts) -MainMenu2_img_contacts_txt.set_pos(int(0),int(220)) -MainMenu2_img_contacts_txt.set_size(240,100) -MainMenu2_img_contacts_txt.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_contacts_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -MainMenu2_img_contacts_txt.set_text("联系人") -MainMenu2_img_contacts_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) - - -#心律检测 -MainMenu2_heartrate = MainMenu2_til.add_tile(3, 0, lv.DIR.LEFT | lv.DIR.RIGHT) -label_text = lv.label(MainMenu2_heartrate) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("4") -MainMenu2_img_heartrate = lv.img(MainMenu2_heartrate) -MainMenu2_img_heartrate.set_size(160,160) -MainMenu2_img_heartrate.set_pos(40,20) -MainMenu2_img_heartrate.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.png") -MainMenu2_img_heartrate.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_heartrate.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -MainMenu2_img_heartrate_txt = lv.label(MainMenu2_heartrate) -MainMenu2_img_heartrate_txt.set_pos(int(0),int(220)) -MainMenu2_img_heartrate_txt.set_size(240,100) -MainMenu2_img_heartrate_txt.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_heartrate_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -MainMenu2_img_heartrate_txt.set_text("心率检测") -MainMenu2_img_heartrate_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) - - -#血样检测 -MainMenu2_spo2 = MainMenu2_til.add_tile(4, 0, lv.DIR.LEFT | lv.DIR.RIGHT) -label_text = lv.label(MainMenu2_spo2) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("5") -MainMenu2_img_spo2 = lv.img(MainMenu2_spo2) -MainMenu2_img_spo2.set_size(160,160) -MainMenu2_img_spo2.set_pos(40,20) -MainMenu2_img_spo2.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.png") -MainMenu2_img_spo2.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_spo2.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -MainMenu2_img_spo2_txt = lv.label(MainMenu2_spo2) -MainMenu2_img_spo2_txt.set_pos(int(0),int(220)) -MainMenu2_img_spo2_txt.set_size(240,100) -MainMenu2_img_spo2_txt.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_spo2_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -MainMenu2_img_spo2_txt.set_text("血氧检测") -MainMenu2_img_spo2_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) - - -#工具箱 -MainMenu2_toolbox = MainMenu2_til.add_tile(5, 0, lv.DIR.LEFT | lv.DIR.RIGHT) -label_text = lv.label(MainMenu2_toolbox) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("6") -MainMenu2_img_toolbox = lv.img(MainMenu2_toolbox) -MainMenu2_img_toolbox.set_size(160,160) -MainMenu2_img_toolbox.set_pos(40,20) -MainMenu2_img_toolbox.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.png") -MainMenu2_img_toolbox.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_toolbox.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -MainMenu2_img_toolbox_txt = lv.label(MainMenu2_toolbox) -MainMenu2_img_toolbox_txt.set_pos(int(0),int(220)) -MainMenu2_img_toolbox_txt.set_size(240,100) -MainMenu2_img_toolbox_txt.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_toolbox_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -MainMenu2_img_toolbox_txt.set_text("工具箱") -MainMenu2_img_toolbox_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) - - -#设置 -MainMenu2_setting = MainMenu2_til.add_tile(6, 0, lv.DIR.LEFT | lv.DIR.RIGHT) -label_text = lv.label(MainMenu2_setting) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("7") -MainMenu2_img_setting = lv.img(MainMenu2_setting) -MainMenu2_img_setting.set_size(160,160) -MainMenu2_img_setting.set_pos(40,20) -MainMenu2_img_setting.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.png") -MainMenu2_img_setting.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_setting.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -MainMenu2_img_setting_txt = lv.label(MainMenu2_setting) -MainMenu2_img_setting_txt.set_pos(int(0),int(220)) -MainMenu2_img_setting_txt.set_size(240,100) -MainMenu2_img_setting_txt.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_setting_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -MainMenu2_img_setting_txt.set_text("设置") -MainMenu2_img_setting_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) - - -#体温测量 -MainMenu2_temperature = MainMenu2_til.add_tile(7, 0, lv.DIR.LEFT | lv.DIR.RIGHT) -label_text = lv.label(MainMenu2_temperature) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("8") -MainMenu2_img_temperature = lv.img(MainMenu2_temperature) -MainMenu2_img_temperature.set_size(160,160) -MainMenu2_img_temperature.set_pos(40,20) -MainMenu2_img_temperature.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.png") -MainMenu2_img_temperature.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_temperature.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -MainMenu2_img_temperature_txt = lv.label(MainMenu2_temperature) -MainMenu2_img_temperature_txt.set_pos(int(0),int(220)) -MainMenu2_img_temperature_txt.set_size(240,100) -MainMenu2_img_temperature_txt.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_temperature_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -MainMenu2_img_temperature_txt.set_text("体温测量") -MainMenu2_img_temperature_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) - - -#微聊 -MainMenu2_wechat = MainMenu2_til.add_tile(8, 0, lv.DIR.LEFT | lv.DIR.RIGHT) -label_text = lv.label(MainMenu2_wechat) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("9") -MainMenu2_img_wechat = lv.img(MainMenu2_wechat) -MainMenu2_img_wechat.set_size(160,160) -MainMenu2_img_wechat.set_pos(40,20) -MainMenu2_img_wechat.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.png") -MainMenu2_img_wechat.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_wechat.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) - -MainMenu2_img_wechat_txt = lv.label(MainMenu2_wechat) -MainMenu2_img_wechat_txt.set_pos(int(0),int(220)) -MainMenu2_img_wechat_txt.set_size(240,100) -MainMenu2_img_wechat_txt.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_wechat_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -MainMenu2_img_wechat_txt.set_text("微聊") -MainMenu2_img_wechat_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) - -from ui_WatchFaceScreen import WatchFace -#主菜单风格2,单页 -class MainMenuScreen(Screen): - NAME = "main_menu" - def __init__(self): - self.meta = MainMenu2 - self.watchface = WatchFace() - self.menu_id = "0" - print("MainMenu1:__init__") - MainMenu2_img_phone.add_event_cb(lambda e: self.img_cb(e, "Phone"), lv.EVENT.CLICKED, None) - MainMenu2_img_toolbox.add_event_cb(lambda e: self.img_cb(e, "toolbox"), lv.EVENT.CLICKED, None) - MainMenu2_img_setting.add_event_cb(lambda e: self.img_cb(e, "setting"), lv.EVENT.CLICKED, None) - MainMenu2_img_heartrate.add_event_cb(lambda e: self.img_cb(e, "heartrate"), lv.EVENT.CLICKED, None) - MainMenu2_img_contacts.add_event_cb(lambda e: self.img_cb(e, "contacts"), lv.EVENT.CLICKED, None) - MainMenu2_img_wechat.add_event_cb(lambda e: self.img_cb(e, "wechat"), lv.EVENT.CLICKED, None) - MainMenu2_img_spo2.add_event_cb(lambda e: self.img_cb(e, "spo2"), lv.EVENT.CLICKED, None) - MainMenu2_img_temperature.add_event_cb(lambda e: self.img_cb(e, "temperature"), lv.EVENT.CLICKED, None) - MainMenu2_img_alipay.add_event_cb(lambda e: self.img_cb(e, "alipay_open"), lv.EVENT.CLICKED, None) - EventMesh.subscribe("watch_top_show", self.watch_top_show) - #MainMenu2_img_alipay.add_event_cb(lambda e: img_cb(e, "Watchface_set"), lv.EVENT.CLICKED, None) - - def initialization(self): - self.watchface.initialization(MainMenu2_Watchface) - - if self.menu_id =="0": - MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF) - # if self.meta_info in globals() : - # MainMenu2_til.set_tile_id(self.meta_info[0],self.meta_info[1],lv.ANIM.OFF) - pass# - - def watch_top_show(self, event, msg): # - MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF) - - def img_cb(self, e, msg): - print("MainMenu2:img_cb:{}".format(msg)) - EventMesh.publish("load_screen", {"screen": "{}".format(msg)}) - - def done_return(self): - MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF) - - def btn1_release(self): - flag = EventMesh.publish("get_lcd_state") - if flag == 0: - EventMesh.publish(constants.EVENT.SYSTEM_UP) - else: - if MainMenu2_til.get_tile_act() != None: - id = MainMenu2_til.get_tile_act().get_child(0).get_text() - if id != "0": - MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF) - - - def btn8_press(self): - flag = EventMesh.publish("get_lcd_state") - if MainMenu2_til.get_tile_act() != None: - id = MainMenu2_til.get_tile_act().get_child(0).get_text() - if id == "0": - if flag == 1: - EventMesh.publish(constants.EVENT.SYSTEM_SLEEP) - else: - EventMesh.publish(constants.EVENT.SYSTEM_UP) - else: - if flag == 1: - MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF) - else: - EventMesh.publish(constants.EVENT.SYSTEM_UP) - else: - if flag == 1: - MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF) - else: - EventMesh.publish(constants.EVENT.SYSTEM_UP) - - def done_bottom_to_top(self): - id = MainMenu2_til.get_tile_act().get_child(0).get_text() - if id == "0": - EventMesh.publish("load_screen", {"screen": "call_log"}) - self.menu_id = id - - def done_top_to_bottom(self): - id = MainMenu2_til.get_tile_act().get_child(0).get_text() - if id == "0": - EventMesh.publish("load_screen", {"screen": "popup"}) - self.menu_id = id - def done_left_to_right(self): - id = MainMenu2_til.get_tile_act().get_child(0).get_text() - print("done_left_to_right:ID{}".format(id)) - if id == "0": - MainMenu2_til.set_tile_id(8,0,lv.ANIM.OFF) - elif self.menu_id != '2' and id == '1': - MainMenu2_til.set_tile_id(8,0,lv.ANIM.OFF) - self.menu_id = id - def done_right_to_left(self): - id = MainMenu2_til.get_tile_act().get_child(0).get_text() - print("done_right_to_left:ID{}".format(id)) - if id == "0": - MainMenu2_til.set_tile_id(0,0,lv.ANIM.OFF) - elif (self.menu_id != '8' ) and id == '9': - MainMenu2_til.set_tile_id(0,0,lv.ANIM.OFF) - self.menu_id = id - - def Close(self): - self.watchface.Close() - print("main_menu Close !!!!!!!!") - return - diff --git a/3.code/1.watch/2.code/ui_setting.py b/3.code/1.watch/2.code/ui_setting.py deleted file mode 100644 index caefb125..00000000 --- a/3.code/1.watch/2.code/ui_setting.py +++ /dev/null @@ -1,1607 +0,0 @@ - -import lvgl as lv -import ql_fs -import EventMesh -from misc import Power -from ui import style_screen,style_font_youyuan_20,ContStyle,style_btn,style_img,Screen,style_contact_btn -import constants -import osTimer -import audio -from machine import Pin -import ujson -from lcd import style_font_youyuan_40 -# -------------------------------------------setting screen---------------------------------------------------------- - -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_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_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) - -setting_cont_y = 0 -setting_screen = lv.obj() -setting_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -setting_imei_img = lv.img(setting_screen) -setting_imei_img.set_pos(75, 10) -setting_imei_img.set_size(90, 30) -setting_imei_img.set_src("E:/static/setting/setting_text.png") -setting_imei_img.add_style(style_img, 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_screen) -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, setting_cont_y) -# 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, setting_cont_y)set_size(47, 47) -# setting_language_img.set_size(232, 80) -# 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_cont_y += 60 - -setting_dialswitch = lv.btn(setting_cont) -setting_dialswitch.set_pos(0, setting_cont_y) -setting_dialswitch.set_size(0, 0) -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(0, setting_cont_y) -setting_dialswitch_img.set_size(232, 80) -setting_dialswitch_img.add_flag(lv.obj.FLAG.CLICKABLE) -setting_dialswitch_img.set_src("E:/static/setting/menu_watch_switch.png") -setting_dialswitch_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) -setting_cont_y+=90 - - -# 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(232, 80) -# 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_cont_y+=60 - -setting_imei = lv.btn(setting_cont) -setting_imei.set_pos(0, setting_cont_y) -setting_imei.set_size(0, 0) -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(0, setting_cont_y) -setting_imei_img.set_size(232, 80) -setting_imei_img.add_flag(lv.obj.FLAG.CLICKABLE) -setting_imei_img.set_src("E:/static/setting/menu_imei_qrcode.png") -setting_imei_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) -setting_cont_y+=90 - -setting_app = lv.btn(setting_cont) -setting_app.set_pos(0, setting_cont_y) -setting_app.set_size(0, 0) -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(0, setting_cont_y) -setting_app_img.set_size(232, 80) -setting_app_img.add_flag(lv.obj.FLAG.CLICKABLE) -setting_app_img.set_src("E:/static/setting/menu_app_qrcode.png") -setting_app_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) -setting_cont_y+=90 - -setting_bright = lv.btn(setting_cont) -setting_bright.set_pos(0, setting_cont_y) -setting_bright.set_size(0, 0) -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(0, setting_cont_y) -setting_bright_img.set_size(232, 80) -setting_bright_img.add_flag(lv.obj.FLAG.CLICKABLE) -setting_bright_img.set_src("E:/static/setting/menu_bright.png") -setting_bright_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) -setting_cont_y+=90 - -setting_volume = lv.btn(setting_cont) -setting_volume.set_pos(0, setting_cont_y) -setting_volume.set_size(0, 0) -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(0, setting_cont_y) -setting_volume_img.set_size(232, 80) -setting_volume_img.add_flag(lv.obj.FLAG.CLICKABLE) -setting_volume_img.set_src("E:/static/setting/menu_volume.png") -setting_volume_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) -setting_cont_y+=90 - -setting_restore = lv.btn(setting_cont) -setting_restore.set_pos(0, setting_cont_y) -setting_restore.set_size(0, 0) -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(0, setting_cont_y) -setting_restore_img.set_size(232, 80) -setting_restore_img.add_flag(lv.obj.FLAG.CLICKABLE) -setting_restore_img.set_src("E:/static/setting/menu_restore.png") -setting_restore_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) -setting_cont_y+=90 - -setting_poweroff = lv.btn(setting_cont) -setting_poweroff.set_pos(0, setting_cont_y) -setting_poweroff.set_size(0, 0) -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(0, setting_cont_y) -setting_poweroff_img.set_size(232, 80) -setting_poweroff_img.add_flag(lv.obj.FLAG.CLICKABLE) -setting_poweroff_img.set_src("E:/static/setting/menu_poweroff.png") -setting_poweroff_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) -setting_cont_y+=90 - -setting_version = lv.btn(setting_cont) -setting_version.set_pos(0, setting_cont_y) -setting_version.set_size(0, 0) -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(0, setting_cont_y) -setting_version_img.set_size(232, 80) -setting_version_img.add_flag(lv.obj.FLAG.CLICKABLE) -setting_version_img.set_src("E:/static/setting/menu_version.png") -setting_version_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) -setting_cont_y+=90 - -setting_update = lv.btn(setting_cont) -setting_update.set_pos(0, setting_cont_y) -setting_update.set_size(0, 0) -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(0, setting_cont_y) -setting_update_img.set_size(232, 80) -setting_update_img.add_flag(lv.obj.FLAG.CLICKABLE) -setting_update_img.set_src("E:/static/setting/menu_upgrade.png") -setting_update_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - -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": "totalvolume"}), 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) - - # img regist btton - # setting_language.add_event_cb(lambda e: self.load_screen(e, {"screen": "language"}), lv.EVENT.CLICKED, None) - setting_dialswitch_img.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_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "imei"}), lv.EVENT.CLICKED, None) - setting_app_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "app"}), lv.EVENT.CLICKED, None) - setting_bright_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "brightness"}), lv.EVENT.CLICKED, None) - setting_volume_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "totalvolume"}), lv.EVENT.CLICKED, None) - setting_restore_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "restore"}), lv.EVENT.CLICKED, None) - setting_poweroff_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "poweroff"}), lv.EVENT.CLICKED, None) - setting_update_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "update"}), lv.EVENT.CLICKED, None) - setting_version_img.add_event_cb(lambda e: self.load_screen(e, {"screen": "version"}), lv.EVENT.CLICKED, None) - - - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) -################################################################## -# -------------------------------------------language screen---------------------------------------------------------- -language_screen = lv.obj() -language_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -language_title = lv.label(language_screen) -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_screen) -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_screen) -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_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -dialswitch_title = lv.label(dialswitch_screen) -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_screen) -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_screen) -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_screen.center() -menustyle_screen.set_size(240, 320) -menustyle_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -menustyle_title = lv.label(menustyle_screen) -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_screen) -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_screen) -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) - - - - - -# -------------------------------------------app screen---------------------------------------------------------- -#app_screen = lv.obj() -app_screen = lv.obj() -app_screen.center() -app_screen.set_size(240, 320) -app_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -app_img = lv.img(app_screen) -app_img.set_pos(int(20),int(40)) -app_img.set_size(200,200) -app_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) -app_img.add_flag(lv.obj.FLAG.CLICKABLE) -app_img.set_src("E:/static/IMAGE_APP_QR_CODE.png") -app_img.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_screen) -app_label.set_pos(0, 280) -app_label.set_size(240, 20) -app_label.set_text(" ") -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) - - -# -------------------------------------------volume screen---------------------------------------------------------- -volume_screen = lv.obj() -volume_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -volume_phone_btn = lv.btn(volume_screen) -volume_phone_btn.set_size(240,40) -volume_phone_btn.set_pos(0,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.CENTER, 0, 0) -volume_phone_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -volume_alarm_btn = lv.btn(volume_screen) -volume_alarm_btn.set_size(240,40) -volume_alarm_btn.set_pos(0,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.CENTER, 0, 0) -volume_alarm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -volume_message_btn = lv.btn(volume_screen) -volume_message_btn.set_size(240,40) -volume_message_btn.set_pos(0,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.CENTER, 0, 0) -volume_message_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -# -------------------------------------------phonering screen---------------------------------------------------------- -phonering_screen = lv.obj() -phonering_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -phonering_title = lv.label(phonering_screen) -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_screen) -phonering_label1.set_pos(10, 70) -phonering_label1.set_size(230, 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_screen) -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_reduce_imgbtn = lv.img(phonering_screen) -phonering_reduce_imgbtn.set_pos(0, 150) -phonering_reduce_imgbtn.set_size(110, 46) -phonering_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) -phonering_reduce_imgbtn.set_src("E:/static/reduce_btn.png") -phonering_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - -phonering_add_imgbtn = lv.img(phonering_screen) -phonering_add_imgbtn.set_pos(120, 150) -phonering_add_imgbtn.set_size(110, 46) -phonering_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) - -phonering_add_imgbtn.set_src("E:/static/add_btn.png") - -phonering_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - -# -------------------------------------------alarmvolume screen---------------------------------------------------------- -alarmvolume_screen = lv.obj() -alarmvolume_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -alarmvolume_title = lv.label(alarmvolume_screen) -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_screen) -alarmvolume_label1.set_pos(10, 70) -alarmvolume_label1.set_size(230, 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_screen) -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_reduce_imgbtn = lv.img(alarmvolume_screen) -alarmvolume_reduce_imgbtn.set_pos(5, 150) -alarmvolume_reduce_imgbtn.set_size(110, 46) -alarmvolume_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) - -alarmvolume_reduce_imgbtn.set_src("E:/static/reduce_btn.png") - -alarmvolume_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - -alarmvolume_add_imgbtn = lv.img(alarmvolume_screen) -alarmvolume_add_imgbtn.set_pos(125, 150) -alarmvolume_add_imgbtn.set_size(110, 46) -alarmvolume_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) - -alarmvolume_add_imgbtn.set_src("E:/static/add_btn.png") - -alarmvolume_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - -# -------------------------------------------msgvolume screen---------------------------------------------------------- -msgvolume_screen = lv.obj() -msgvolume_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -msgvolume_title = lv.label(msgvolume_screen) -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_screen) -msgvolume_label1.set_pos(10, 70) -msgvolume_label1.set_size(230, 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_screen) -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_reduce_imgbtn = lv.img(msgvolume_screen) -msgvolume_reduce_imgbtn.set_pos(5, 150) -msgvolume_reduce_imgbtn.set_size(110, 46) -msgvolume_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) - -msgvolume_reduce_imgbtn.set_src("E:/static/reduce_btn.png") - -msgvolume_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - -msgvolume_add_imgbtn = lv.img(msgvolume_screen) -msgvolume_add_imgbtn.set_pos(125, 150) -msgvolume_add_imgbtn.set_size(110, 46) -msgvolume_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) - -msgvolume_add_imgbtn.set_src("E:/static/add_btn.png") - -msgvolume_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - -# -------------------------------------------restore screen---------------------------------------------------------- -restore_screen = lv.obj() -restore_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -restore_label = lv.label(restore_screen) -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_screen) -restore_confirm.set_text("确认") -restore_confirm.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -restore_confirm.set_size(120, 40) -restore_confirm.set_pos(0,180) -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_screen) -restore_cancel.set_text("返回") -restore_cancel.set_size(120, 40) -restore_cancel.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -restore_cancel.set_pos(120,180) -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) - - - - - -# -------------------------------------------version screen---------------------------------------------------------- -version_screen = lv.obj() -version_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -version_msg = "Software Version:\n\ -MMI\n\ -Version:UIX8910_C55_V\n\ -1.0_Release\n\ -Build Time:\n\ -2-17-2023\n\ -9:32:5\n\ -IMEI:\n\ -" - -version_label1 = lv.label(version_screen) -version_label1.set_pos(0, 0) -version_label1.set_size(240, 25) -version_label1.set_long_mode(lv.label.LONG.WRAP) -version_label1.set_text("Software Version:") -version_label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -version_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -version_label2 = lv.label(version_screen) -version_label2.set_pos(0, 25) -version_label2.set_size(240, 30) -version_label2.set_long_mode(lv.label.LONG.WRAP) -version_label2.set_text("MMI") -version_label2.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -version_label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -version_label3 = lv.label(version_screen) -version_label3.set_pos(0, 55) -version_label3.set_size(240, 30) -version_label3.set_long_mode(lv.label.LONG.WRAP) -version_label3.set_text("Version:") -version_label3.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -version_label3.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -version_label3 = lv.label(version_screen) -version_label3.set_pos(0, 80) -version_label3.set_size(240, 30) -version_label3.set_long_mode(lv.label.LONG.WRAP) -version_label3.set_text("UIX8910_C55_V") -version_label3.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -version_label3.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -version_label4 = lv.label(version_screen) -version_label4.set_pos(0, 105) -version_label4.set_size(240, 30) -version_label4.set_long_mode(lv.label.LONG.WRAP) -version_label4.set_text("1.0_Release") -version_label4.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -version_label4.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -version_label5 = lv.label(version_screen) -version_label5.set_pos(0, 130) -version_label5.set_size(240, 30) -version_label5.set_long_mode(lv.label.LONG.WRAP) -version_label5.set_text("Build Time:") -version_label5.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -version_label5.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -version_label6 = lv.label(version_screen) -version_label6.set_pos(0, 155) -version_label6.set_size(240, 30) -version_label6.set_long_mode(lv.label.LONG.WRAP) -version_label6.set_text("2-17-2023") -version_label6.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -version_label6.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -version_label7 = lv.label(version_screen) -version_label7.set_pos(0, 180) -version_label7.set_size(240, 30) -version_label7.set_long_mode(lv.label.LONG.WRAP) -version_label7.set_text("9:32:5") -version_label7.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -version_label7.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -version_label8 = lv.label(version_screen) -version_label8.set_pos(0, 205) -version_label8.set_size(240, 30) -version_label8.set_long_mode(lv.label.LONG.WRAP) -version_label8.set_text("IMEI:") -version_label8.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -version_label8.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -version_label9 = lv.label(version_screen) -version_label9.set_pos(20, 230) -version_label9.set_size(220, 30) -version_label9.set_long_mode(lv.label.LONG.WRAP) -version_label9.set_text(" ") -version_label9.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -version_label9.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - - - -# -------------------------------------------update screen---------------------------------------------------------- -update_screen = lv.obj() -update_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -update_title = lv.label(update_screen) -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_screen) -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_screen) -update_return.set_text("返回") -update_return.set_size(240, 40) -update_return.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -update_return.set_pos(0,240) -update_return.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -update_return.add_flag(lv.obj.FLAG.CLICKABLE) - -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): - ret = 0 - ret = ql_fs.path_exists("/ext/static/storage_file")#电话本 - if ret == True: - ql_fs.rmdirs("/ext/static/storage_file") - ql_fs.mkdirs("/ext/static/storage_file") - EventMesh.publish("alipay_unbind") - EventMesh.publish(constants.PROTOCOL.DLT_SEND) - - 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": "setting"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -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": "setting"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -class VersionScreen(Screen): - NAME = "version" - - def __init__(self): - super().__init__() - self.meta = version_screen - self.btn_count = 0 - def initialization(self): - imei = EventMesh.publish(constants.EVENT.GET_IMEI) - version_label9.set_text(imei) - - def Close(self): - self.btn_count = 0 - - def done_click(self): - self.btn_count += 1 - if self.btn_count >= 5 : - EventMesh.publish("load_screen", {"screen": "factorymode"}) - - def done_bottom_to_top(self): - self.btn_count += 1 - if self.btn_count >= 5 : - EventMesh.publish("load_screen", {"screen": "factorymode"}) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - -# -------------------------------------------poweroff screen---------------------------------------------------------- -poweroff_screen = lv.obj() -poweroff_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -poweroff_img = lv.img(poweroff_screen) -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_screen) -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_img = lv.img(poweroff_screen) -poweroff_confirm_img.set_size(176, 46) -poweroff_confirm_img.set_pos(32, 150) -poweroff_confirm_img.set_src("E:/static/off_icon.png") -poweroff_confirm_img.add_flag(lv.obj.FLAG.CLICKABLE) -poweroff_confirm_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - -poweroff_confirm_label = lv.label(poweroff_confirm_img) -poweroff_confirm_label.set_text("关机") -poweroff_confirm_label.align(lv.ALIGN.CENTER, 0, 0) -poweroff_confirm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -poweroff_return = lv.img(poweroff_screen) -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, 0, 0) -poweroff_return_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -poweroff_return.set_ext_click_area(20) - - -class PoweroffScreen(Screen): - NAME = "poweroff" - - def __init__(self): - super().__init__() - self.meta = poweroff_screen - poweroff_confirm_img.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 initialization(self): - pass - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def confirm(self, e): - EventMesh.publish("load_screen", {"screen": "poweroff_comfirm"}) - - - def concel(self, e): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - - -poweroff_confirm_screen = lv.obj() -poweroff_confirm_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -poweroff_confirm_label = lv.label(poweroff_confirm_screen) -poweroff_confirm_label.set_text("Goodbye") -poweroff_confirm_label.align(lv.ALIGN.CENTER, 0, 0) -poweroff_confirm_label.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT) - -class PoweroffConfirmScreen(Screen): - NAME = "poweroff_comfirm" - - def __init__(self): - super().__init__() - self.meta = poweroff_confirm_screen - self.timer = osTimer() - self.read_data = {} - def initialization(self): - step = EventMesh.publish("get_old_step_value") - if step != 0: - self.read_data = EventMesh.publish("get_storage_data") - self.read_data["old_step"] = step - EventMesh.publish("set_storage_data", self.read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - self.timer.start(3*1000,0,self.power_off) - - def power_off(self,*args): - Power.powerDown() - - def done_return(self): - pass - - def btn1_release(self): - pass - - def btn8_press(self): - pass - - -class LanguageScreen(Screen): - NAME = "language" - - def __init__(self): - super().__init__() - self.meta = language_screen - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - -class DialswitchScreen(Screen): - NAME = "dialswitch" - - def __init__(self): - super().__init__() - self.meta = dialswitch_screen - self.read_data = {} - self.watchface_style_num = "Watchface1" - 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 initialization(self): - self.read_data = EventMesh.publish("get_storage_data") - if self.read_data != {}: - b = str("watchface") in self.read_data.keys() - if b == True: - self.watchface_style_num = self.read_data["watchface"] - if self.watchface_style_num == "Watchface1": - btn1_switch.add_state(lv.STATE.CHECKED) - btn2_switch.clear_state(lv.STATE.CHECKED) - else: - btn1_switch.clear_state(lv.STATE.CHECKED) - btn2_switch.add_state(lv.STATE.CHECKED) - - - def watchface01(self,e): - btn1_switch.add_state(lv.STATE.CHECKED) - btn2_switch.clear_state(lv.STATE.CHECKED) - self.read_data = EventMesh.publish("get_storage_data") - self.read_data["watchface"] = "Watchface1" - EventMesh.publish("set_storage_data", self.read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - EventMesh.publish("set_change_face", "Watchface1") - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def watchface02(self,e): - btn1_switch.clear_state(lv.STATE.CHECKED) - btn2_switch.add_state(lv.STATE.CHECKED) - self.read_data = EventMesh.publish("get_storage_data") - self.read_data["watchface"] = "Watchface2" - EventMesh.publish("set_storage_data", self.read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - EventMesh.publish("set_change_face", "Watchface2") - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -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": "main_menu"}) - - 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": "main_menu"}) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - -# -------------------------------------------imei screen---------------------------------------------------------- -imei_screen = lv.obj() -imei_screen.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_screen, 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_label = lv.label(imei_screen) -imei_label.set_pos(0, 280) -imei_label.set_size(240, 20) -imei_label.set_text(" ") -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) -class ImeiScreen(Screen): - NAME = "imei" - - def __init__(self): - super().__init__() - self.meta = imei_screen - - def initialization(self): - - imei = EventMesh.publish(constants.EVENT.GET_IMEI) - imei_qr_data = str(imei) - imei_qr.update(imei_qr_data,len(imei_qr_data)) - imei_label.set_text(imei) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -class AppScreen(Screen): - NAME = "app" - - def __init__(self): - super().__init__() - self.meta = app_screen - def initialization(self): - imei = EventMesh.publish(constants.EVENT.GET_IMEI) - app_label.set_text(imei) - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) -# -------------------------------------------brightness screen---------------------------------------------------------- -brightness_screen = lv.obj() -brightness_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - - -brightness_title = lv.label(brightness_screen) -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_screen) -brightness_label1.set_pos(10, 70) -brightness_label1.set_size(230, 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_screen) -brightness_bar.set_pos(20, 100) -brightness_bar.set_size(200, 25) -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_reduce_imgbtn = lv.img(brightness_screen) -brightness_reduce_imgbtn.set_pos(5, 195) -brightness_reduce_imgbtn.set_size(110, 46) -brightness_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) -brightness_reduce_imgbtn.set_src("E:/static/reduce_btn.png") -brightness_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - -brightness_add_imgbtn = lv.img(brightness_screen) -brightness_add_imgbtn.set_pos(125, 195) -brightness_add_imgbtn.set_size(110, 46) -brightness_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) -brightness_add_imgbtn.set_src("E:/static/add_btn.png") -brightness_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - -brightness_label_time = lv.label(brightness_screen) -brightness_label_time.set_pos(10, 150) -brightness_label_time.set_size(80, 30) -brightness_label_time.set_text("时间:") -brightness_label_time.set_long_mode(lv.label.LONG.WRAP) -brightness_label_time.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) -brightness_label_time.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -brightness_time_reduce_img = lv.img(brightness_screen) -brightness_time_reduce_img.set_pos(90, 145) -brightness_time_reduce_img.set_size(30, 34) -brightness_time_reduce_img.set_src("E:/static/time_up2.png") -brightness_time_reduce_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - -brightness_time_reduce_imgbtn= lv.img(brightness_screen) -brightness_time_reduce_imgbtn.set_size(80, 45) -brightness_time_reduce_imgbtn.set_pos(90, 140) -brightness_time_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) - - -brightness_label_time_text = lv.label(brightness_screen) -brightness_label_time_text.set_pos(130, 152) -brightness_label_time_text.set_size(60, 30) -brightness_label_time_text.set_text("5秒") -brightness_label_time_text.set_long_mode(lv.label.LONG.WRAP) -brightness_label_time_text.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) -brightness_label_time_text.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -brightness_time_add_img = lv.img(brightness_screen) -brightness_time_add_img.set_pos(190, 145) -brightness_time_add_img.set_size(30, 34) -brightness_time_add_img.set_src("E:/static/time_up1.png") -brightness_time_add_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - -brightness_time_add_imgbtn= lv.img(brightness_screen) -brightness_time_add_imgbtn.set_size(70, 45) -brightness_time_add_imgbtn.set_pos(170, 140) -brightness_time_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) - - - -class BrightnessScreen(Screen): - NAME = "brightness" - - def __init__(self): - super().__init__() - self.level = 6 - self.time = 10 - self.read_data = {} - 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) - - brightness_time_reduce_imgbtn.add_event_cb(lambda e: self.reduce_time_level(e), - lv.EVENT.CLICKED, None) - - brightness_time_add_imgbtn.add_event_cb(lambda e: self.add_time_level(e), - lv.EVENT.CLICKED, None) - def initialization(self): - self.level = EventMesh.publish("get_brightness_level") - self.time = EventMesh.publish("get_brightness_time") - print("self.time:{}".format(self.time)) - brightness_label_time_text.set_text("{}秒".format(self.time)) - self.show_bar() - def add_level(self, e): - EventMesh.publish("push_add_brightness_level") - self.level = EventMesh.publish("get_brightness_level") - print("self.level:{}".format(self.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 reduce_time_level(self, e): - if self.time > 5: - self.time-=5 - EventMesh.publish("set_brightness_time",self.time) - self.read_data = EventMesh.publish("get_storage_data") - self.read_data["brightness_time"] = self.time - - EventMesh.publish("set_storage_data", self.read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - brightness_label_time_text.set_text("{}秒".format(self.time)) - print("reduce_time_level:{}".format(self.read_data)) - - def add_time_level(self, e): - self.time+=5 - if self.time >= 30: - self.time = 30 - EventMesh.publish("set_brightness_time",self.time) - self.read_data = EventMesh.publish("get_storage_data") - self.read_data["brightness_time"] = self.time - - EventMesh.publish("set_storage_data", self.read_data) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - brightness_label_time_text.set_text("{}秒".format(self.time)) - print("add_time_level:{}".format(self.read_data)) - - - - def show_bar(self): - if self.level == None: - self.level = 6 - brightness_bar.set_value((100 // 10) * self.level, lv.ANIM.OFF) - - - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - -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": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - - -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 done_left_to_right(self): - pass - - def done_right_to_left(self): - pass - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "volume"}) - - - -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": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "volume"}) - - - -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): - msgvolume_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": "main_menu"}) - - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "volume"}) - - - -#-----------------------------------------Total--volum------------------------------- - -volume_adjust_screen = lv.obj() -volume_adjust_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -totalvolume_title = lv.label(volume_adjust_screen) -totalvolume_title.set_pos(0, 10) -totalvolume_title.set_size(240, 40) -totalvolume_title.set_text("铃声调节") -totalvolume_title.set_long_mode(lv.label.LONG.WRAP) -totalvolume_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -totalvolume_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -totalvolume_label1 = lv.label(volume_adjust_screen) -totalvolume_label1.set_pos(10, 70) -totalvolume_label1.set_size(230, 40) -totalvolume_label1.set_text("铃声:") -totalvolume_label1.set_long_mode(lv.label.LONG.WRAP) -totalvolume_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0) -totalvolume_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) - -totalvolume_bar = lv.bar(volume_adjust_screen) -totalvolume_bar.set_pos(20, 100) -totalvolume_bar.set_size(200, 25) -totalvolume_bar.set_style_anim_time(1000, lv.PART.INDICATOR | lv.STATE.DEFAULT) -totalvolume_bar.set_mode(lv.bar.MODE.NORMAL) -totalvolume_bar.set_value(50, lv.ANIM.OFF) -totalvolume_bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT) -totalvolume_bar.add_style(style_bar_indic, lv.PART.INDICATOR | lv.STATE.DEFAULT) - -totalvolume_reduce_imgbtn = lv.img(volume_adjust_screen) -totalvolume_reduce_imgbtn.set_pos(5, 145) -totalvolume_reduce_imgbtn.set_size(110, 46) -totalvolume_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) -totalvolume_reduce_imgbtn.set_src("E:/static/reduce_btn.png") -totalvolume_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - - -totalvolume_add_imgbtn = lv.img(volume_adjust_screen) -totalvolume_add_imgbtn.set_pos(125, 145) -totalvolume_add_imgbtn.set_size(110, 46) -totalvolume_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE) -totalvolume_add_imgbtn.set_src("E:/static/add_btn.png") -totalvolume_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT) - -class totalvolumeScreen(Screen): - NAME = "totalvolume" - - def __init__(self): - super().__init__() - self.meta = volume_adjust_screen - totalvolume_add_imgbtn.add_event_cb(lambda e: self.add_volum_size(e), - lv.EVENT.CLICKED, None) - totalvolume_reduce_imgbtn.add_event_cb(lambda e: self.reduce_volum_size(e), - lv.EVENT.CLICKED, None) - self.read_data = {} - self.volum_size = 8 - self.aud = audio.Audio(0) - self.aud.set_pa(Pin.GPIO29) - - def initialization(self): - self.read_data = EventMesh.publish("get_storage_data") - # print("self.read_data:{}".format(self.read_data)) - num = EventMesh.publish("get_volum_size") - if num == None: - self.volum_size = 8 - else: - self.volum_size = num - self.aud.setVolume(self.volum_size) - self.show_bar(0) - - def add_volum_size(self, e): - self.volum_size+=2 - if self.volum_size >= 11: - self.volum_size = 11 - self.show_bar(1) - - def reduce_volum_size(self, e): - if self.volum_size > 0: - self.volum_size -= 2 - self.show_bar(1) - - def show_bar(self,msg): - totalvolume_bar.set_value((100 // 11) * self.volum_size, lv.ANIM.OFF) - if msg == 1: - self.read_data = EventMesh.publish("get_storage_data") - self.read_data["volum"] = self.volum_size - self.aud.setVolume(self.volum_size) - EventMesh.publish("set_storage_data", self.read_data) - EventMesh.publish("set_volum_size",self.volum_size) - print("self.read_data:size :{}".format(self.read_data)) - with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd: - ujson.dump(self.read_data,fd) - self.aud.play(1, 1, 'E:/static/audio_audio_haixiu.mp3') #播放声音 - - def Close(self): - self.aud.stop() - - def done_return(self): - self.aud.stop() - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "setting"}) - - def btn8_press(self): - EventMesh.publish("watch_top_show") - EventMesh.publish("load_screen", {"screen": "main_menu"}) diff --git a/3.code/1.watch/3.font/font_24.c b/3.code/1.watch/3.font/font_24.c deleted file mode 100644 index 169dc0d8..00000000 --- a/3.code/1.watch/3.font/font_24.c +++ /dev/null @@ -1,95 +0,0 @@ -/* -*--------------------------------------------------------------- -* Lvgl Font Tool -* -* 注:使用unicode编码 -* 注:本字体文件由Lvgl Font Tool V0.4 生成 -* 作者:阿里(qq:617622104) -*--------------------------------------------------------------- -*/ - - -#include "lvgl.h" - - -typedef struct{ - uint16_t min; - uint16_t max; - uint8_t bpp; - uint8_t reserved[3]; -}x_header_t; -typedef struct{ - uint32_t pos; -}x_table_t; -typedef struct{ - uint8_t adv_w; - uint8_t box_w; - uint8_t box_h; - int8_t ofs_x; - int8_t ofs_y; - uint8_t r; -}glyph_dsc_t; - - -static x_header_t __g_xbf_hd = { - .min = 0x0020, - .max = 0x9fa0, - .bpp = 4, -}; - - -//static uint8_t __g_font_buf[416];//如bin文件存在SPI FLASH可使用此buff - - -static uint8_t *__user_font_getdata(int offset, int size){ - //如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size); - //如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset); - return __g_font_buf; -} - - -static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t unicode_letter) { - if( unicode_letter>__g_xbf_hd.max || unicode_letter<__g_xbf_hd.min ) { - return NULL; - } - uint32_t unicode_offset = sizeof(x_header_t)+(unicode_letter-__g_xbf_hd.min)*4; - uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); - if( p_pos[0] != 0 ) { - uint32_t pos = p_pos[0]; - glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(pos, sizeof(glyph_dsc_t)); - return __user_font_getdata(pos+sizeof(glyph_dsc_t), gdsc->box_w*gdsc->box_h*__g_xbf_hd.bpp/8); - } - return NULL; -} - - -static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) { - if( unicode_letter>__g_xbf_hd.max || unicode_letter<__g_xbf_hd.min ) { - return NULL; - } - uint32_t unicode_offset = sizeof(x_header_t)+(unicode_letter-__g_xbf_hd.min)*4; - uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); - if( p_pos[0] != 0 ) { - glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(p_pos[0], sizeof(glyph_dsc_t)); - dsc_out->adv_w = gdsc->adv_w; - dsc_out->box_h = gdsc->box_h; - dsc_out->box_w = gdsc->box_w; - dsc_out->ofs_x = gdsc->ofs_x; - dsc_out->ofs_y = gdsc->ofs_y; - dsc_out->bpp = __g_xbf_hd.bpp; - return true; - } - return false; -} - - -//Microsoft YaHei,,-1 -//字模高度:32 -//XBF字体,外部bin文件 -lv_font_t font_24 = { - .get_glyph_bitmap = __user_font_get_bitmap, - .get_glyph_dsc = __user_font_get_glyph_dsc, - .line_height = 32, - .base_line = 0, -}; - diff --git a/3.code/1.watch/3.font/font_40.bin b/3.code/1.watch/3.font/font_40.bin deleted file mode 100644 index d32ad786..00000000 Binary files a/3.code/1.watch/3.font/font_40.bin and /dev/null differ diff --git a/3.code/1.watch/3.font/font_40.c b/3.code/1.watch/3.font/font_40.c deleted file mode 100644 index a5deab45..00000000 --- a/3.code/1.watch/3.font/font_40.c +++ /dev/null @@ -1,95 +0,0 @@ -/* -*--------------------------------------------------------------- -* Lvgl Font Tool -* -* 注:使用unicode编码 -* 注:本字体文件由Lvgl Font Tool V0.4 生成 -* 作者:阿里(qq:617622104) -*--------------------------------------------------------------- -*/ - - -#include "lvgl.h" - - -typedef struct{ - uint16_t min; - uint16_t max; - uint8_t bpp; - uint8_t reserved[3]; -}x_header_t; -typedef struct{ - uint32_t pos; -}x_table_t; -typedef struct{ - uint8_t adv_w; - uint8_t box_w; - uint8_t box_h; - int8_t ofs_x; - int8_t ofs_y; - uint8_t r; -}glyph_dsc_t; - - -static x_header_t __g_xbf_hd = { - .min = 0x0021, - .max = 0x007a, - .bpp = 4, -}; - - -//static uint8_t __g_font_buf[1113];//如bin文件存在SPI FLASH可使用此buff - - -static uint8_t *__user_font_getdata(int offset, int size){ - //如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size); - //如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset); - return __g_font_buf; -} - - -static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t unicode_letter) { - if( unicode_letter>__g_xbf_hd.max || unicode_letter<__g_xbf_hd.min ) { - return NULL; - } - uint32_t unicode_offset = sizeof(x_header_t)+(unicode_letter-__g_xbf_hd.min)*4; - uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); - if( p_pos[0] != 0 ) { - uint32_t pos = p_pos[0]; - glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(pos, sizeof(glyph_dsc_t)); - return __user_font_getdata(pos+sizeof(glyph_dsc_t), gdsc->box_w*gdsc->box_h*__g_xbf_hd.bpp/8); - } - return NULL; -} - - -static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) { - if( unicode_letter>__g_xbf_hd.max || unicode_letter<__g_xbf_hd.min ) { - return NULL; - } - uint32_t unicode_offset = sizeof(x_header_t)+(unicode_letter-__g_xbf_hd.min)*4; - uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); - if( p_pos[0] != 0 ) { - glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(p_pos[0], sizeof(glyph_dsc_t)); - dsc_out->adv_w = gdsc->adv_w; - dsc_out->box_h = gdsc->box_h; - dsc_out->box_w = gdsc->box_w; - dsc_out->ofs_x = gdsc->ofs_x; - dsc_out->ofs_y = gdsc->ofs_y; - dsc_out->bpp = __g_xbf_hd.bpp; - return true; - } - return false; -} - - -//Microsoft YaHei,,-1 -//字模高度:53 -//XBF字体,外部bin文件 -lv_font_t font_40 = { - .get_glyph_bitmap = __user_font_get_bitmap, - .get_glyph_dsc = __user_font_get_glyph_dsc, - .line_height = 53, - .base_line = 0, -}; - diff --git a/3.code/1.watch/3.font/font_bin_merge.py b/3.code/1.watch/3.font/font_bin_merge.py deleted file mode 100644 index 05db77bf..00000000 --- a/3.code/1.watch/3.font/font_bin_merge.py +++ /dev/null @@ -1,46 +0,0 @@ -from struct import * - - -def bin_create(*args): - if len(args) < 1: - print("wrong params number!") - return -1 - # bin header :one byte for font_num, font_num bytes for bin_size - # 大端1,小端2 - # endian = input("输入大小端:") - with open("ext_font.bin","wb") as dest_file: - # start - start = "s" - end = "e" - - font_num = len(args) - bin_data = [] - bin_size = [] - font_name = "" - - for i in range(font_num): - with open(args[i], "rb") as bin_file: - data = bin_file.read() - padding = "\0" * (128 - len(args[i])) - string_padded = args[i] + padding - font_name += string_padded - bin_size.append(len(data)) - bin_data.append(data) - - # # 大端 - # if endian == "1": - # write_data = pack(">B%ds%dI"% (font_num*128, font_num), font_num, font_name.encode(), *bin_size) - # # 小端 - # else: - write_data = pack("